Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于更新事务的PHP PDO选择的澄清_Php_Mysql_Concurrency_Pdo_Transactions - Fatal编程技术网

关于更新事务的PHP PDO选择的澄清

关于更新事务的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语句,甚至在

我不熟悉使用事务

基本上,我能够在MySQL控制台中使用
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()
命令的情况下自动为我关闭事务?