【问题标题】:Two concurrent transactions on SERIALIZABLE isolation levelSERIALIZABLE 隔离级别上的两个并发事务
【发布时间】:2019-05-27 19:37:41
【问题描述】:

让我们考虑两个并发的 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 应该会失败。为什么没有?

【问题讨论】:

    标签: sql postgresql transactions


    【解决方案1】:

    实际上,SELECT 查询会看到数据库的快照 查询立即开始运行。 Source

    SELECT 查询只会对该快照进行操作。但其他类型的查询的行为与您预期的一样。

    更新、删除、选择更新和选择共享。 . .将等待第一个更新事务提交或回滚(如果它仍在进行中)。 Source (ibid)

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


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

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 2011-09-30
      • 2011-06-28
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多