可SERIALIZABLE隔离级别上的两个并发事务

时间:2019-05-27 09:47:47

标签: sql postgresql transactions

让我们考虑两个并发的SQL事务:

X = 0 
T1:                    |  T2: 
begin                  | begin
set serializable level | set serializable level
                       |  
WRITE(X,1)
                       | READ(X) : 0
COMMIT                 |  
                       | COMMIT

我已经用PosgreSQL对其进行了测试。 为什么T2正确提交?这两个事务都有可序列化的级别。因此,在我看来, 之后T2开始了,行X被修改了。因此,T2:COMMIT应该失败。为什么不呢?

1 个答案:

答案 0 :(得分:1)

  

实际上,一个SELECT查询可以看到数据库的快照。   查询开始运行的瞬间。 Source

SELECT查询将仅对该快照进行操作。但是其他类型的查询的行为也与您期望的一样。

  

UPDATE,DELETE,SELECT FOR UPDATE和SELECT FOR SHARE。 。 。将等待第一个更新事务提交或回滚(如果仍在进行中)。 Source (ibid)

例如,可以通过运行两个psql会话来验证此行为。在一个会话中运行UPDATE语句,在另一个会话中运行SELECT ... FOR UPDATE。


this answer中引用的文档可能会使您感到困惑;该文档是关于一个稍微不同的问题。但是您可能会发现终端会话的记录本很有用。