2013-10-03 48 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

等待没有必要取得进展。存活的冲突交易可能授予冲突交易所争用的锁定。

。另一方面,其他事务可能仍然活跃,可能会做类似的事情。可能会出现另一个僵局。经过一段时间后,其他交易可能是一个或正在做其他事情。

重试使第二次尝试成功的可能性更大。正确性不是必需的。

相关问题