2

我是使用交易的新手。

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

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

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

4

1 回答 1

3

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

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

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

于 2013-06-24T16:35:15.313 回答