【问题标题】:Will a transaction know about changes done in other transactions一个事务会知道其他事务中所做的更改吗
【发布时间】:2015-12-21 08:31:35
【问题描述】:

假设我有一个表 (Table1),其中包含 value=0 的 Value 字段。

然后两个用户(USER1 和 USER2)同时运行下面的事务

BEGIN
  UPDATE Table1 SET Value=Value+1; 
  UPDATE Table1 SET StatusField='Y' WHERE Value=2; 
COMMIT;

如果命令按以下顺序执行

USER1 开始交易

USER2 开始交易

USER1 结束交易;

USER2 结束交易;

statusfield 会设置为 Y 吗?

注意!这不是一个真实的例子,你可能永远不想使用这样的代码,但我只是想了解事务是如何工作的。换句话说,我想知道的是,如果两个事务同时开始并且其中一个完成,那么已经开始的事务是否会知道第一个事务所做的更改?

【问题讨论】:

    标签: postgresql transactions


    【解决方案1】:

    这取决于所选的隔离级别。

    只要默认隔离级别为 Read Committed 并且您没有更改它 - 答案是“是的,它将被其他事务看到”。

    UPDATEDELETESELECT FOR UPDATESELECT FOR SHARE 命令在搜索目标行方面的行为与 SELECT 相同:它们只会找到在命令开始时间提交的目标行.但是,这样的目标行在找到时可能已经被另一个并发事务更新(或删除或锁定)。在这种情况下,可能的更新程序将等待第一个更新事务提交或回滚(如果它仍在进行中)。如果第一个更新程序回滚,则其效果被否定,第二个更新程序可以继续更新最初找到的行。

    其他隔离级别行为:

    • Read uncommitted 的行为相同;
    • Repeatable readSerializable 将失败(以防第一个事务成功提交)。

    更多信息:13.2.1. Read Committed Isolation Level

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-07
      • 2017-02-07
      • 1970-01-01
      • 2013-05-31
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多