关于更新事务的 PHP PDO 选择的说明

Posted

技术标签:

【中文标题】关于更新事务的 PHP PDO 选择的说明【英文标题】:Clarification about PHP PDO Select for Update Transaction 【发布时间】:2013-06-21 01:00:45 【问题描述】:

我是使用事务的新手。

基本上,我可以使用START TRANSACTION 后跟SELECT ... FOR UPDATE 语句成功锁定mysql 控制台中的一行。该行保持锁定状态,直到我在控制台中运行 COMMIT 命令

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

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

【问题讨论】:

当您尝试在控制台上检查时,您确定您的事务仍处于打开状态并且尚未通过提交关闭吗?可能是隔离级别的问题,因此您的第一个和第二个示例的默认值不一样......也许这可以帮助找出它们是否不同? ***.com/questions/5347567/… 我刚刚又测试了一遍。我非常肯定我没有通过 PHP 关闭交易,因为我的脚本中没有 $db->commit()。但是,为什么我能够在 PHP 中关闭当前事务之前启动其他事务?当我在控制台中进行交易时,不会出现此问题。即使不运行commit() 命令,PHP 是否会自动为我关闭事务? 【参考方案1】:

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

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

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

【讨论】:

以上是关于关于更新事务的 PHP PDO 选择的说明的主要内容,如果未能解决你的问题,请参考以下文章

PHP中使用PDO操作事务的一些小测试

PHP中使用PDO操作事务的一些小测试

PHP中的MySQLi扩展学习mysqli的事务与预处理语句

PHP中的MySQLi扩展学习mysqli的事务与预处理语句

Php pdo rollBack() 不适用于更新语句

关于安装PHP补装PDO与PDO_MYSQL操作