在可序列化的交易中,所有40级错误是否正常?

时间:2013-05-06 16:07:10

标签: sql postgresql

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

如果我正确理解了手册,这是可以预期的。当这些错误发生时,我想要重试该事务。我怀疑的是,在处理SERIALIZABLE事务时,所有的40级错误是否“正常”。换句话说,我可以假设任何40级错误都会导致我重试该事务,或者这个假设是否仅适用于40级错误的子集?

2 个答案:

答案 0 :(得分:7)

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

它包含错误代码:

  • 40000 transaction_rollback
  • 40002 transaction_integrity_constraint_violation
  • 40001 serialization_failure
  • 40003 statement_completion_unknown
  • 40P01 deadlock_detected

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

我没有遇到statement_completion_unknown;我建议你查一查。

就我个人而言,我只会在deadlock_detectedserialization_failure上重试。

答案 1 :(得分:1)

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