【问题标题】:If I run a SELECT after an INSERT in a PDO transaction, will my changes show?如果我在 PDO 事务中的 INSERT 之后运行 SELECT,我的更改会显示吗?
【发布时间】:2021-10-19 10:31:02
【问题描述】:
我无法找到一个简单明了的答案来回答这个问题,所以这里是:
我正在编写一个 PHP 脚本,它做了两件事:
-
与我的数据库的事务开始使用 PDO;
-
开始尝试捕获
-
我使用 PDO 将几千行插入到表中
-
我在同一张表上执行 SELECT 并在 PHP 中运行一堆检查以查找列中的重复项(如果有的话)
-
最后我更新表格以删除重复项。
-
如果一切正常,我执行$pdo->commit(),如果发生任何错误,try/catch 执行$pdo->rollBack()。
我的问题是:
当我在第 4 步中执行 SELECT 时,返回的数据是否还会包含我之前在第 3 步中插入的行?在非交易设置中,我知道它会,但由于它在交易中,我不确定。
【问题讨论】:
标签:
php
mysql
pdo
transactions
【解决方案1】:
如果找不到答案,请自行测试。经验证据 FTW。
mysql> create table mytable (id int primary key, msg text);
Query OK, 0 rows affected (0.05 sec)
mysql> insert into mytable values (1, 'foo');
Query OK, 1 row affected (0.03 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from mytable;
+----+------+
| id | msg |
+----+------+
| 1 | foo |
+----+------+
1 row in set (0.00 sec)
mysql> insert into mytable values (2, 'bar');
Query OK, 1 row affected (0.00 sec)
mysql> select * from mytable;
+----+------+
| id | msg |
+----+------+
| 1 | foo |
| 2 | bar |
+----+------+
但实际上是有记载的:
https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html
一致读取意味着 InnoDB 使用多版本控制向查询呈现数据库在某个时间点的快照。查询会看到在该时间点之前提交的事务所做的更改,以及稍后或未提交的事务所做的更改。此规则的例外是查询会看到同一事务中先前语句所做的更改。