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

Is it possible that both transactions rollback during a deadlock or serialization error?

在 PostgreSQL(和其他 MVCC 数据库)中,事务可以由于死锁或序列化错误而回滚。假设当前有两笔交易 运行,是否有可能两笔交易(而不是只有一笔交易)由于此类错误而失败?

我之所以这么问,是因为我在写重试实现。如果两个事务都可能失败,如果都立即重试,我们可能会陷入永无止境的重试循环。如果只有一个交易会失败,我认为尽快重试没有任何坏处。

是的。死锁可能涉及两个以上的事务。在这种情况下,不止一个可能会被终止。但这是极其罕见的情况。正常.

如果只有两个事务死锁,一个幸存。 The manual:

PostgreSQL automatically detects deadlock situations and resolves them by aborting one of the transactions involved, allowing the other(s) to complete.

序列化失败只发生在REPEATABLE READ or SERIALIZABLE transaction isolation。我不知道可以同时发生多少序列化失败的任何特定限制。但是我也没听说过有什么需要延迟重试的。

无论哪种方式,我都会尽快重试。