是否有可能在死锁或序列化错误期间回滚两个事务?

时间:2018-01-13 11:44:22

标签: postgresql transactions mvcc

在PostgreSQL(和其他MVCC数据库)中,由于死锁或序列化错误,事务可能会回滚。假设当前正在运行两个事务,是否有可能由于这种错误而导致两个事务(而不仅仅是一个)失败?

我之所以要问的是我正在编写重试实现。如果两个事务都可能失败,如果两个事务都立即重试,我们可能会以永无止境的重试循环结束。如果只有一个交易失败,我认为不会尽快重试。

1 个答案:

答案 0 :(得分:1)

是。死锁可能涉及两个以上的事务。在这种情况下,可以终止多个。但这是非常罕见的情况。通常

如果只有两个事务处于死锁状态,那么就会幸免于难。 The manual:

  

PostgreSQL会自动检测死锁情况并通过中止其中一个事务来解决它们,允许其他事务完成。

序列化失败只发生在REPEATABLE READ or SERIALIZABLE transaction isolation。我不知道可以同时发生多少次序列化失败的任何特定限制。但我也从未听说有必要推迟重试。

我会尽快重试。