【问题标题】:Is it possible that both transactions rollback during a deadlock or serialization error?是否有可能在死锁或序列化错误期间两个事务都回滚?
【发布时间】:2018-01-13 11:44:22
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql transactions mvcc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。会不会是 所有 涉及的事务都被中止(在死锁或序列化错误的情况下)?或者总是至少有一个尚存的交易?在第一种情况下,我想尽快重试可能不是一个好主意。
    • @LeslyO:序列化错误与SERIALIZABLE 事务隔离不同,而不是默认READ COMMITTED。至于死锁:我从未见过不止一个被终止,并且手册还告知一次只有一个事务被终止。但是事务可能会由于其他不相关的异常而回滚,这似乎不太可能发生。
    • 再次感谢。您能否解释一下Serialization errors are a different matter with SERIALIZABLE transaction isolation, not with the default READ COMMITTED 的含义。我知道隔离级别之间的区别,但不应该将所有隔离错误(无论级别如何)都视为死锁错误:重试事务?如果我应该为此提出一个新问题,请告诉我。
    • 我专注于死锁和丢失的序列化错误,您也将其包含在问题中。此外,准确地说,这些发生在REPEATABLE READSERIALIZABLE 事务隔离中。我不知道可以同时发生多少个序列化失败的任何特定限制。但我也从未听说有必要延迟重试。
    • 感谢您分享您的知识。
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多