在PostgreSQL(和其他MVCC数据库)中,由于死锁或序列化错误,事务可能会回滚。假设当前正在运行两个事务,是否有可能由于这种错误而导致两个事务(而不仅仅是一个)失败?
我之所以要问的是我正在编写重试实现。如果两个事务都可能失败,如果两个事务都立即重试,我们可能会以永无止境的重试循环结束。如果只有一个交易失败,我认为不会尽快重试。
答案 0 :(得分:1)
是。死锁可能涉及两个以上的事务。在这种情况下,可以终止多个。但这是非常罕见的情况。通常
如果只有两个事务处于死锁状态,那么就会幸免于难。 The manual:
PostgreSQL会自动检测死锁情况并通过中止其中一个事务来解决它们,允许其他事务完成。
序列化失败只发生在REPEATABLE READ
or SERIALIZABLE
transaction isolation。我不知道可以同时发生多少次序列化失败的任何特定限制。但我也从未听说有必要推迟重试。
我会尽快重试。