【问题标题】:Is Rollback necessary in this select for update (no rows returned)?此选择是否需要回滚以进行更新(不返回行)?
【发布时间】:2014-04-04 18:32:32
【问题描述】:
$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

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

【问题讨论】:

  • 如何撤消SELECT?假装你一开始就没有要求吗?

标签: php mysql pdo rollback


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在 select for update 中,根据您使用将 autocommit 设置为 0 的 beginTransaction 的方式,选定的行会获得一个行锁(当然必须是 innodb,但我假设您知道这一点)。

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

    就我个人而言,我会为适合回滚的错误情况保留回滚,所以我不会回滚,而只是通过提交将整个内容放在 try -- catch 块中来结束块。那么你就不需要关心解锁机制或者是否选择了行。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 2021-05-06
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        • 1970-01-01
        相关资源
        最近更新 更多