我已經運行到偶爾死鎖在我的應用程序,因爲兩筆交易這需要更新同一行,但在不同的順序(例如,事務A更新行X然後Ÿ,而事務B更新行ÿ然後X)。依靠Postgres的併發控制死鎖檢測安全嗎?
對於各種原因,解決避免這種死鎖的傳統方法 - 鎖定或以一致的順序更新行 - 並不理想。
由於我試圖執行的更新以其他方式是冪等和順序無關的,因此在應用程序級別簡單捕獲這些偶爾的死鎖並重試事務是安全合理的嗎?
例如:
def process_update(update):
attempt = 0
while attempt < 10:
try:
execute("SAVEPOINT foo")
for row in update:
execute("UPDATE mytable SET … WHERE …", row)
execute("RELEASE SAVEPOINT foo")
break
except Deadlock:
execute("ROLLBACK TO SAVEPOINT foo")
attempt += 1
raise Exception("Too many retries")
這是一個合理的想法?還是有與Postgres的死鎖檢測相關的成本,可能會使它危險?