我刚开始使用事务。
基本上,我能够使用 START TRANSACTION
后跟 SELECT ... FOR UPDATE
语句成功锁定 MySQL 控制台中的单行。该行保持锁定状态,直到我在控制台中运行 COMMIT
命令
但是,当我在 PHP 脚本中使用 $db->beginTransaction()
执行相同操作,然后使用 $db->execute("SELECT ... FOR UPDATE")
,在运行 $db->commit()
脚本之前该行不会被锁定。
我的意思是,即使在 PHP 中运行提交脚本来结束事务之前,我仍然可以在控制台中成功执行 SELECT ... FOR UPDATE
语句。这是否意味着我的 PHP 脚本在事务期间未成功锁定该行?我怎样才能检查?
最佳答案
PHP 和 PDO 在脚本结束后自动关闭并回滚打开的事务,并且有很好的理由 - 通常,您不希望事务在 PHP
解析结束后保持打开状态。参见这里:http://php.net/manual/en/pdo.transactions.php
When the script ends or when a connection is about to be closed, if you have an outstanding transaction, PDO will automatically roll it back. This is a safety measure to help avoid inconsistency in the cases where the script terminates unexpectedly--if you didn't explicitly commit the transaction, then it is assumed that something went awry, so the rollback is performed for the safety of your data.
要进行测试,您可以在 execute
之后添加 sleep(120)
,启动 PHP
脚本,切换到 MySQL
控制台并在那里发出语句。我想你会体验到预期的锁定。
关于php - 关于 PHP PDO Select for Update Transaction 的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17276870/