我的一些交易被宣布为SERIALIZABLE。有时我会回到40级错误,例如40001 serialization_failure
和40P01 deadlock_detected
(我还没有看到其他代码),特别是当我通过执行大量并发事务对系统进行压力测试时。
如果我正确理解了手册,这是可以预期的。当这些错误发生时,我想要重试该事务。我怀疑的是,在处理SERIALIZABLE事务时,所有的40级错误是否“正常”。换句话说,我可以假设任何40级错误都会导致我重试该事务,或者这个假设是否仅适用于40级错误的子集?
答案 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_detected
和serialization_failure
上重试。
答案 1 :(得分:1)
与此同时,Kevin Grittner在pgsql-general邮件列表中给了我an unequivocal answer。总而言之,在并发设置中发出可序列化事务时,错误40001和40P01都是“正常”。