此选择是否需要回滚以进行更新(不返回任何行)


Is Rollback necessary in this select for update (no rows returned)?

$stmt = $pdo->prepare("SELECT somedata FROM mytable FOR UPDATE");
$pdo->beginTransaction();
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ( $row == FALSE ) {
   $pdo->rollBack();
} else {
   ....run some code and then commit

回滚是否必要,因为仅在由于未返回行而未锁定行时才调用回滚?选择更新并从不回滚或在实际未选择任何内容的情况下提交是否会浪费任何资源?

在选择更新时,根据您使用 beginTransaction 的方式,选择的行会得到一个行锁(当然必须是 innodb,但我假设你知道这一点),它将自动提交设置为 0。

要释放锁,您可以提交或回滚。

就个人而言,我会为适合回滚的错误条件保留回滚,所以我不会回滚,而只是通过提交结束块,整个事情都在 try -- catch 块中。 然后,您无需担心解锁机制或是否选择了行。

try {
    $stmt = $pdo->prepare("SELECT somedata FROM mytable FOR UPDATE");
    $pdo->beginTransaction();
    $stmt->execute();
    while ($row = ....) {
    }
    $pdo->commit();
} catch( PDOException $Exception ) {
    $pdo->rollback();
}

仅当打开事务并且一个或多个表中的数据已更改时,才需要回滚。SELECT语句本身不需要回滚。

根据文档 - 是的。因为您需要事务来执行这样的锁定。

但是,如果您只是很快断开连接,则不需要显式回滚