【问题标题】: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 脚本,它做了两件事:

  1. 与我的数据库的事务开始使用 PDO;

  2. 开始尝试捕获

  3. 我使用 PDO 将几千行插入到表中

  4. 我在同一张表上执行 SELECT 并在 PHP 中运行一堆检查以查找列中的重复项(如果有的话)

  5. 最后我更新表格以删除重复项。

  6. 如果一切正常,我执行$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 使用多版本控制向查询呈现数据库在某个时间点的快照。查询会看到在该时间点之前提交的事务所做的更改,以及稍后或未提交的事务所做的更改。此规则的例外是查询会看到同一事务中先前语句所做的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2014-07-17
      相关资源
      最近更新 更多