可重複讀取和可序列化隔離等級都可能產生錯誤,旨在防止序列化異常。 如先前所述,使用這些等級的應用程式必須準備好重試因序列化錯誤而失敗的交易。 此類錯誤的訊息文字會根據具體情況而有所不同,但始終具有 SQLSTATE 代碼 40001
(serialization_failure
)。
重試死鎖失敗也可能是明智的。 這些具有 SQLSTATE 代碼 40P01
(deadlock_detected
)。
在某些情況下,重試唯一鍵失敗(SQLSTATE 代碼 23505
(unique_violation
))和排除約束失敗(SQLSTATE 代碼 23P01
(exclusion_violation
))也是合適的。 例如,如果應用程式在檢查目前儲存的鍵之後為主要鍵欄位選取一個新值,則可能會遇到唯一鍵失敗,因為另一個應用程式實例同時選取了相同的新鍵。 這實際上是一個序列化失敗,但伺服器不會將其偵測為此類失敗,因為它無法「看到」插入的值與先前的讀取之間的關聯。 還有一些極端情況,即使原則上伺服器有足夠的資訊來確定序列化問題是根本原因,伺服器也會發出唯一鍵或排除約束錯誤。 雖然建議無條件地重試 serialization_failure
錯誤,但在重試這些其他錯誤代碼時需要更加小心,因為它們可能代表持久性錯誤情況,而不是暫時性故障。
重要的是重試完整的交易,包括決定要發出哪些 SQL 和/或使用哪些值的所有邏輯。 因此,PostgreSQL 不提供自動重試功能,因為它無法保證正確性。
交易重試不能保證重試的交易將完成; 可能需要多次重試。 在爭用非常高的情況下,完成交易可能需要多次嘗試。 在涉及衝突的預備交易的情況下,在預備交易提交或回滾之前,可能無法取得進展。
如果您在說明文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的地方,請使用此表格回報說明文件問題。