我是使用事务的新手。
基本上,我能够使用START TRANSACTION
和SELECT ... FOR UPDATE
语句成功地锁定MySQL控制台中的一行。行保持锁定,直到我在控制台中运行COMMIT
命令
但是,当我在使用$db->beginTransaction()
和$db->execute("SELECT ... FOR UPDATE")
的PHP脚本中执行相同操作时,在运行$db->commit()
脚本之前,该行不会被锁定。
我的意思是,即使在用PHP运行提交脚本以结束事务之前,我仍然可以在控制台中成功地执行SELECT ... FOR UPDATE
语句。这是否意味着我的PHP脚本在事务处理过程中没有成功锁定行?我该如何检查?
PHP分别在脚本结束后PDO会自动关闭和回滚打开的事务,原因很充分——通常情况下,您不希望事务在PHP
解析结束后保持打开状态。请参见此处:http://php.net/manual/en/pdo.transactions.php
当脚本结束或连接即将关闭时,如果有未完成的事务,PDO将自动回滚。这是一种安全措施,有助于在脚本意外终止的情况下避免不一致——如果您没有明确提交事务,则会认为出现了问题,因此执行回滚是为了数据的安全。
要进行测试,您可以在execute
之后添加一个sleep(120)
,启动PHP
脚本,切换到MySQL
控制台并在那里发出语句。我想你会体验到预期的锁定。