2

我想编写一些代码来检测死锁,如果发生死锁,请重试尝试最多n次的任何 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;
    }
}

为什么这样的重试逻辑要在重试之间包含这样的时间延迟?

4

2 回答 2

2

没有延迟,死锁重试可能会“猛击”网络/磁盘/数据库的活动,直到循环停止。最好在循环中放置一个小的延迟,让其他流量先通过(这实际上可能是解决死锁所必需的),然后再试一次。

于 2013-10-03T06:09:14.033 回答
1

等待不是取得进步的必要条件。幸存的冲突事务很可能被授予了冲突事务争用的锁。

另一方面,另一个事务可能仍然处于活动状态并且可能正在做类似的事情。可能还会出现另一个僵局。稍作延迟后,其他交易可能是一个或正在做其他事情。

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

于 2014-06-15T12:14:46.923 回答