2013-05-06 51 views
5

我的一些交易被声明为SERIALIZABLE。有时我会回到类别错误,如40001 serialization_failure40P01 deadlock_detected(我还没有看到其他代码),特别是当我通过执行大量并发事务来对系统进行压力测试时。在可序列化事务中,所有40类错误都是正常的吗?

如果我正确理解手册,这是可以预料的。当这些错误发生时,我因此想重试交易。我怀疑是否在处理SERIALIZABLE事务时,类40错误的全部是“正常”。换句话说,我是否可以假设任何第40类错误应该导致我重试交易,还是这个假设仅对于第40类错误的一个子集是正确的?

+0

什么版本的Postgres你在吗? – Kuberchaun 2013-05-06 17:04:29

+0

我在PostgreSQL 9.1上。尽管Ubuntu 13.04包可用,但我会尽快更新到9.2。 – 2013-05-06 19:25:07

回答

7

the error codes section of the manual40xxxxSQLSTATE类别是“事务回滚”。

它包括的错误代码:

  • 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上重试。

+0

感谢您的回复。虽然你不太确定只检查40001和40P01是否真的是正确的方法。我正在寻找更为明确的答案... – 2013-05-07 15:12:34

+0

@JonSmark由于我没有看到文档中其他地方的这些sqlcodes的引用,因此您可能需要查看源代码。我现在不能这样做;来自其他项目的实时需求。 – 2013-05-08 00:07:19

1

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

相关问题