关于更新事务的PHP PDO选择的澄清
我不熟悉使用事务 基本上,我能够在MySQL控制台中使用关于更新事务的PHP PDO选择的澄清,php,mysql,concurrency,pdo,transactions,Php,Mysql,Concurrency,Pdo,Transactions,我不熟悉使用事务 基本上,我能够在MySQL控制台中使用START TRANSACTION和SELECT>成功锁定一行。。。用于更新语句。在控制台中运行COMMIT命令之前,该行将保持锁定状态 但是,当我在PHP脚本中使用$db->beginTransaction()然后使用$db->execute(“SELECT…FOR UPDATE”)执行相同操作时,在运行$db->commit()脚本之前,行不会被锁定 我的意思是我仍然可以成功地做一个选择。。。在控制台中的FOR UPDATE语句,甚至在
START TRANSACTION
和SELECT>成功锁定一行。。。用于更新
语句。在控制台中运行COMMIT
命令之前,该行将保持锁定状态
但是,当我在PHP脚本中使用$db->beginTransaction()
然后使用$db->execute(“SELECT…FOR UPDATE”)
执行相同操作时,在运行$db->commit()
脚本之前,行不会被锁定
我的意思是我仍然可以成功地做一个
选择。。。在控制台中的FOR UPDATE
语句,甚至在我用PHP运行提交脚本结束事务之前。这是否意味着我的PHP脚本在事务期间没有成功锁定行?如何检查?PHP分别在脚本结束后,PDO会自动关闭并回滚打开的事务,原因非常充分-通常,您不希望事务在PHP
解析结束后保持打开状态。请看这里:
当脚本结束或连接即将关闭时,如果有未完成的事务,PDO将自动回滚。这是一种安全措施,有助于在脚本意外终止的情况下避免不一致性——如果没有显式提交事务,则假定发生了错误,因此执行回滚是为了数据的安全
为了进行测试,您可以在
执行
之后添加睡眠(120)
,启动PHP
脚本,切换到MySQL
控制台并在那里发出语句。我想您将体验到预期的锁定。当您尝试在控制台上检查时,您确定您的事务仍然处于打开状态,并且尚未通过提交关闭吗?隔离级别可能有问题,因此第一个示例和第二个示例的默认值不同。。。也许这有助于发现它们是否不同?我刚刚又测试了一次。我绝对肯定我没有通过PHP关闭事务,因为我的脚本中没有$db->commit()
。但是为什么在关闭PHP中的当前事务之前,我能够启动其他事务呢?在控制台中执行事务时不会出现此问题。PHP是否在不运行commit()
命令的情况下自动为我关闭事务?