此select for update中是否需要回滚(没有返回行)?

时间:2014-04-04 18:32:32

标签: php mysql pdo rollback

$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是否必要,因为只有在因没有返回行而没有锁定行时才会调用它?通过选择更新来浪费任何资源,并且在没有实际选择任何内容的情况下永不回滚或提交?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

在select for update中,选择的行获取一个rowlock(当然必须是innodb,但我假设你知道这一点),这取决于你使用beginTransaction的方式,它将autocommit设置为0。

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

就个人而言,我会保留回滚以适应回滚的错误条件,因此我不会回滚,只是在try-catch块中使用整个事件提交结束块。然后,您不必担心解锁机制或是否选择了行。

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

答案 2 :(得分:0)

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

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