2011-08-03 65 views

回答

6

由於兩個事務試圖修改相同的數據,所以無法自動執行此操作。如果你知道只是再次重試相同的語句將是正確的事情,你需要在你的應用程序中實現它。

但是讓數據庫自動執行這樣做是不負責任的,因爲在發佈可能的修改語句(如果有的話)之前,您的應用程序首先需要查看數據庫中的新情況。

+0

您可以發佈一些客戶端示例代碼在Java(與休眠)用於重試回滾事務。 –

3

通常情況下,您必須編寫應用程序,以便它們隨時準備重新發出事務,如果它由於死鎖而回滾。

http://dev.mysql.com/doc/refman/5.1/en/innodb-deadlocks.html

手動表明,沒有這樣的配置選項存在。

+0

你可以發佈一些Java客戶端示例代碼(與休眠)重試回滾事務? –

0

那麼,你不能,也不會有意義。這取決於您的應用程序是否應對了死鎖問題,以及它的完成方式很大程度上取決於您的業務邏輯,例如,捕捉異常,等待幾秒鐘,重試x次...

3

重新啓動一個事務是指:

  • (任選地)啓動一個新的數據庫連接手柄;
  • 執行第一個啓動新事務的函數/行代碼,並重試整個執行路徑,直到commit

因爲數據庫引擎不可能知道這會死鎖發生後已執行的查詢,不能重試整個事情對你(更何況還有可能是這將可能執行基於不同的查詢應用程序邏輯新更改的數據庫數據)。

相關問題