在 PostgreSQL(和其他 MVCC 数据库)中,事务可能由于死锁或序列化错误而回滚。假设两个事务当前正在运行,是否有可能两个事务,而不是一个事务,由于这种错误而失败?
我问的原因是我正在编写一个重试实现。如果两个事务都可能失败,如果两个事务都立即重试,我们可能会陷入永无止境的重试循环。如果只有一个事务可能失败,我认为尽快重试没有任何害处。
在 PostgreSQL(和其他 MVCC 数据库)中,事务可能由于死锁或序列化错误而回滚。假设两个事务当前正在运行,是否有可能两个事务,而不是一个事务,由于这种错误而失败?
我问的原因是我正在编写一个重试实现。如果两个事务都可能失败,如果两个事务都立即重试,我们可能会陷入永无止境的重试循环。如果只有一个事务可能失败,我认为尽快重试没有任何害处。
是的。死锁可能涉及两个以上的事务。在这种情况下,可以终止多个。但这是一种极为罕见的情况。一般。
如果只有两个事务死锁,一个存活。手册:
PostgreSQL 自动检测死锁情况并通过中止涉及的事务之一来解决它们,允许其他事务完成。
序列化失败只发生在事务隔离REPEATABLE READ
或SERIALIZABLE
事务隔离中。我不知道可以同时发生多少个序列化失败的任何特定限制。但我也从未听说有必要延迟重试。
无论哪种方式,我都会尽快重试。