澄清PHP PDO选择更新事务

时间:2013-06-24 13:36:16

标签: php mysql concurrency pdo transactions

我不熟悉使用交易。

基本上,我能够使用START TRANSACTION后跟SELECT ... FOR UPDATE语句成功锁定MySQL控制台中的单行。在我在控制台中运行COMMIT命令

之前,该行保持锁定状态

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

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