1

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

我问的原因是我正在编写一个重试实现。如果两个事务都可能失败,如果两个事务都立即重试,我们可能会陷入永无止境的重试循环。如果只有一个事务可能失败,我认为尽快重试没有任何害处。

4

1 回答 1

1

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

如果只有两个事务死锁,一个存活。手册:

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

序列化失败只发生在事务隔离REPEATABLE READSERIALIZABLE事务隔离中。我不知道可以同时发生多少个序列化失败的任何特定限制。但我也从未听说有必要延迟重试。

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

于 2018-01-13T12:29:18.763 回答