2013-05-06 53 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都是「正常」的。

相關問題