【问题标题】:Are all class 40 errors normal in serializable transactions?可序列化事务中的所有 40 类错误都正常吗?
【发布时间】:2013-04-30 10:32:23
【问题描述】:

我的一些交易被声明为 SERIALIZABLE。有时我会返回 40 类错误,例如 40001 serialization_failure40P01 deadlock_detected(我还没有看到其他代码),特别是当我通过执行大量并发事务对系统进行压力测试时。

如果我正确理解了手册,这是意料之中的。当这些错误发生时,我因此假设重试事务。我的疑问是在处理 SERIALIZABLE 事务时,所有 类 40 错误是否“正常”。换句话说,我可以假设任何 40 类错误都会导致我重试事务,还是这个假设仅对 40 类错误的子集正确?

【问题讨论】:

  • 你使用的是哪个版本的 Postgres?
  • 我使用的是 PostgreSQL 9.1。虽然我会在 Ubuntu 13.04 软件包可用时立即更新到 9.2。

标签: sql postgresql


【解决方案1】:

根据the error codes section of the manual 40xxxx SQLSTATE 类别是“事务回滚”。

它包括错误代码:

  • 40000transaction_rollback
  • 40002transaction_integrity_constraint_violation
  • 40001serialization_failure
  • 40003 statement_completion_unknown
  • 40P01deadlock_detected

其中,我通常不希望transaction_integrity_constraint_violation 触发重试,因为当尝试提交时DEFERRED 外键检查导致事务中止时会引发重试。如果重试,这不太可能消失,除非您的应用程序存在并发和锁定设计问题。

我没遇到过statement_completion_unknown;我建议你去看看。

我个人只会重试deadlock_detectedserialization_failure

【讨论】:

  • 感谢您的回复。尽管您似乎不太确定仅检查 40001 和 40P01 是否真的是正确的方法。我正在寻找更明确的答案...
  • @JonSmark 因为我在文档的其他地方没有看到对这些 sqlcode 的引用,所以您可能需要查看源代码。我现在不能这样做;其他项目的时间要求。
【解决方案2】:

与此同时,Kevin Grittner 在 pgsql-general 邮件列表中给了我an unequivocal answer。总而言之,在并发设置中发出可序列化事务时,错误 40001 和 40P01 都是“正常的”。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2010-11-26
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多