【问题标题】:Clarification about PHP PDO Select for Update Transaction关于更新事务的 PHP PDO 选择的说明
【发布时间】:2013-06-21 01:00:45
【问题描述】:

我是使用事务的新手。

基本上,我可以使用START TRANSACTION 后跟SELECT ... FOR UPDATE 语句成功锁定MySQL 控制台中的一行。该行保持锁定状态,直到我在控制台中运行 COMMIT 命令

但是,当我在 PHP 脚本中使用$db->beginTransaction() 后跟$db->execute("SELECT ... FOR UPDATE") 执行相同操作时,在我运行$db->commit() 脚​​本之前,该行不会被锁定。

我的意思是,即使在我在 PHP 中运行提交脚本以结束事务之前,我仍然可以在控制台中成功地执行 SELECT ... FOR UPDATE 语句。这是否意味着我的 PHP 脚本在事务期间没有成功锁定行?我怎样才能检查?

【问题讨论】:

  • 当您尝试在控制台上检查时,您确定您的事务仍处于打开状态并且尚未通过提交关闭吗?可能是隔离级别的问题,因此您的第一个和第二个示例的默认值不一样......也许这可以帮助找出它们是否不同? stackoverflow.com/questions/5347567/…
  • 我刚刚又测试了一遍。我非常肯定我没有通过 PHP 关闭交易,因为我的脚本中没有 $db->commit()。但是,为什么我能够在 PHP 中关闭当前事务之前启动其他事务?当我在控制台中进行交易时,不会出现此问题。即使不运行commit() 命令,PHP 是否会自动为我关闭事务?

标签: php mysql concurrency pdo transactions


【解决方案1】:

PHP 分别在脚本结束后自动关闭和回滚打开的事务,并且有很好的理由 - 通常,您不希望事务在 PHP 解析结束后保持打开状态。见这里:http://php.net/manual/en/pdo.transactions.php

当脚本结束或连接即将关闭时,如果有未完成的事务,PDO 会自动回滚。这是一种安全措施,可帮助避免在脚本意外终止的情况下出现不一致 - 如果您没有明确提交事务,则假定出现问题,因此为了数据的安全而执行回滚。

要进行测试,您可以在execute 之后添加sleep(120),启动PHP 脚本,切换到MySQL 控制台并在那里发出语句。我想你会遇到预期的锁定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-31
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多