php 在此选择中是否需要回滚以进行更新(不返回行)?

gcuhipw9  于 2023-02-03  发布在  PHP
关注(0)|答案(3)|浏览(133)
$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

是否有必要执行rollBack,因为只有在由于没有返回行而没有锁定行时才调用它?在实际上没有选择任何行的情况下,选择更新而从不回滚或提交是否会浪费资源?

kyvafyod

kyvafyod1#

在select for update中,根据您使用beginTransaction(将autocommit设置为0)的方式,所选的行将获得一个行锁(当然必须是innodb,但我假设您知道这一点)。
要释放锁,可以提交或回滚。
就我个人而言,我会在需要回滚的错误情况下保留回滚,所以我不会回滚,而只是用一个提交结束块,整个块都在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();
}
6ju8rftf

6ju8rftf2#

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

jm81lzqq

jm81lzqq3#

根据documentation-是的。因为你需要一个事务来执行这样的锁。
但是,如果您刚刚断开连接,则不需要显式回滚

相关问题