可重複讀和序列化兩個隔離級別都會產生旨在防止序列化異常的錯誤。如前所述,使用這些級別的應用程式必須準備好重試因序列化錯誤而失敗的事務。此類錯誤的錯誤訊息文字會根據具體情況而有所不同,但始終具有 SQLSTATE 程式碼 40001
(serialization_failure
)。
重試死鎖失敗也可能是明智的。這些失敗具有 SQLSTATE 程式碼 40P01
(deadlock_detected
)。
在某些情況下,重試唯一鍵失敗(SQLSTATE 程式碼 23505
(unique_violation
))和排除約束失敗(SQLSTATE 程式碼 23P01
(exclusion_violation
))也是合適的。例如,如果應用程式在檢查當前儲存的鍵之後選擇主鍵列的新值,則可能會因另一個應用程式例項同時選擇相同的新鍵而導致唯一鍵失敗。這實際上是序列化失敗,但伺服器不會將其檢測為序列化失敗,因為它無法“看到”插入值與先前讀取之間的聯絡。還有一些特殊情況,儘管原則上伺服器有足夠的資訊來確定序列化問題是根本原因,但它仍會發出唯一鍵或排除約束錯誤。雖然建議無條件地重試 serialization_failure
錯誤,但在重試其他錯誤程式碼時需要更加謹慎,因為它們可能表示持久的錯誤狀況而不是暫時的故障。
重要的是要重試整個事務,包括決定發出哪些 SQL 和/或使用哪些值的所有邏輯。因此,PostgreSQL 不提供自動重試機制,因為它無法保證正確性。
事務重試不能保證重試的事務會完成;可能需要多次重試。在高度衝突的情況下,事務完成可能需要多次嘗試。在涉及衝突的預備事務的情況下,在預備事務提交或回滾之前可能無法取得進展。
如果您在文件中看到任何不正確的內容,與您對特定功能的體驗不符,或者需要進一步澄清,請使用 此表單 報告文件問題。