交易是否会了解其他交易中所做的更改

时间:2015-09-23 21:05:32

标签: postgresql transactions

假设我有一个表(Table1),其Value字段的值为0。

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

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

如果命令按以下顺序执行

USER1启动交易

USER2启动交易

USER1结束交易;

USER2结束交易;

状态字段是否设置为Y?

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

1 个答案:

答案 0 :(得分:3)

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

一旦默认隔离级别为Read Committed并且您尚未更改它 - 答案是"是的,它将在其他交易中显示"。

  在搜索目标行方面,

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

其他隔离级别行为:

  • Read uncommitted表现相同;
  • Repeatable readSerializable将失败(如果第一个交易成功提交)。

更多信息:13.2.1. Read Committed Isolation Level