php - 关于 PHP PDO Select for Update Transaction 的说明

标签 php mysql concurrency pdo transactions

我刚开始使用事务。

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

但是,当我在 PHP 脚本中使用 $db->beginTransaction() 执行相同操作,然后使用 $db->e​​xecute("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/

相关文章:

java - Android LinkedBlockingQueue 取清空列表

php - 如何在sql中将两列连接成一个新列?

php - 防止直接访问 PHP 页面

php - 在我的网站中发现 opencart 错误

php - MySQL查询返回结果无顺序

mysql - 返回 MySQL 查询中等于 NONE 的行

php - 获取数组的最后一个元素,而不更改其内部指针

php - 在 PHP : what can I expect? 中从持久连接切换到非持久连接

c# - thread.join() 也会阻塞其他客户端吗?

unit-testing - 使用共享模拟进行并行测试