2013-10-03 83 views
2

我想編寫一些代碼來檢測死鎖,如果它們發生,重試無論DB操作嘗試高達ñ倍。我注意到人們經常在重試之間增加一段時間延遲。這裏有一些C#代碼來闡明我的意思:死鎖後,爲什麼應用程序代碼在重試之前要等待?

void RetryIfDeadlocks(Action dbOperation, int maximumRetries) 
{ 
    try 
    { 
     dbOperation(); 
    } 
    catch (DeadlockException) 
    { 
     var shouldRetry = maximumRetries > 0; 

     if (shouldRetry) 
     { 
      Task.Delay(millisecondsDelay: 300).Wait(); 
      RetryIfDeadlocks(dbOperation, maximumRetries - 1); 
     } 
     else 
      throw; 
    } 
} 

爲什麼這樣的重試邏輯在重試之間包含這樣的時間延遲?

+0

'Task.Delay(millisecondsDelay:300).Wait()'那是竹貨機,或者是有實際這樣做了沉睡的線程有什麼好處? – Will

+0

@我不確定'Task.Delay'是否比'Thread.Sleep'更好。在我寫這個問題的時候,我可能會認爲'Task.Delay'沒有一些與Thread.Sleep關聯的問題。另外什麼是竹貨機? – Sam

+0

https://en.wikipedia.org/wiki/Cargo_cult_programming當使用async/await時,Task.Delay更勝一籌,當然... – Will

回答

0

沒有延遲,死鎖重試可以「大滿貫」與活動的網絡/磁盤/數據庫,直到循環停止。最好在循環中放置一個小延遲,讓其他流量先通過(實際上可能是解決死鎖所必需的),然後重試。

0

等待沒有必要取得進展。存活的衝突交易可能授予衝突交易所爭用的鎖定。

。另一方面,其他事務可能仍然活躍,可能會做類似的事情。可能會出現另一個僵局。經過一段時間後,其他交易可能是一個或正在做其他事情。

重試使第二次嘗試成功的可能性更大。正確性不是必需的。

相關問題