关于更新事务的 PHP PDO 选择的说明
Posted
技术标签:
【中文标题】关于更新事务的 PHP PDO 选择的说明【英文标题】:Clarification about PHP PDO Select for Update Transaction 【发布时间】: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 脚本在事务期间没有成功锁定行?我怎样才能检查?
【问题讨论】:
当您尝试在控制台上检查时,您确定您的事务仍处于打开状态并且尚未通过提交关闭吗?可能是隔离级别的问题,因此您的第一个和第二个示例的默认值不一样......也许这可以帮助找出它们是否不同? ***.com/questions/5347567/… 我刚刚又测试了一遍。我非常肯定我没有通过 PHP 关闭交易,因为我的脚本中没有$db->commit()
。但是,为什么我能够在 PHP 中关闭当前事务之前启动其他事务?当我在控制台中进行交易时,不会出现此问题。即使不运行commit()
命令,PHP 是否会自动为我关闭事务?
【参考方案1】:
PHP 分别在脚本结束后自动关闭和回滚打开的事务,并且有很好的理由 - 通常,您不希望事务在 PHP
解析结束后保持打开状态。见这里:http://php.net/manual/en/pdo.transactions.php
当脚本结束或连接即将关闭时,如果有未完成的事务,PDO 会自动回滚。这是一种安全措施,可帮助避免在脚本意外终止的情况下出现不一致 - 如果您没有明确提交事务,则假定出现问题,因此为了数据的安全而执行回滚。
要进行测试,您可以在execute
之后添加sleep(120)
,启动PHP
脚本,切换到MySQL
控制台并在那里发出语句。我想你会遇到预期的锁定。
【讨论】:
以上是关于关于更新事务的 PHP PDO 选择的说明的主要内容,如果未能解决你的问题,请参考以下文章
PHP中的MySQLi扩展学习mysqli的事务与预处理语句