我在2個訪問MySQL數據庫的應用程序中使用UniDAC(Devart)。 在某個應用程序進行的某些繁重的更新更新操作中,偶爾會出現錯誤「嘗試獲取鎖定時發現的#40001死鎖;嘗試重新啓動事務」。在閱讀MySQL提示以應對這種情況後,他們說要重試交易。我的問題是要知道在Delphi中做到這一點的最佳方式。我這樣做:避免死鎖MySQL/UniDAC/Delphi
transaction_completed_ok:= False;
repeat
try
my_db.StartTransaction;
(... do the inserts)
my_db.Commit;
transaction_completed_ok:= True;
except
my_db.Rollback;
Sleep(1000);
end;
until transaction_completed_ok;
這樣做每一筆交易,在兩個應用程序,是處理問題的一個有效方法是什麼?任何人都可以分享最佳方式嗎?歡迎任何幫助。
不需要'Sleep()',因爲鎖已經被競爭事務獲得,因此立即重試這個鎖將導致它等待獲取鎖而不是死鎖。此外,您可能想檢查事務失敗的原因,因爲您可能希望以不同的方式處理死鎖以外的其他情況。 – eggyal