2013-10-03 6 views
2

교착 상태를 감지하기위한 코드를 작성하고 싶다면 시도한 DB 작업을 n 번 시도하고 다시 시도하십시오. 나는 종종 사람들이 재 시도 사이에 시간 지연을 추가한다는 것을 알았다.교착 상태가 발생하면 다시 시도하기 전에 응용 프로그램 코드가 대기해야하는 이유는 무엇입니까?

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; 
    } 
} 

왜 그런 재시도 논리가 재시도 사이의 이러한 시간 지연을 포함해야한다 : 여기에 내가 무엇을 의미하는지 명확하게 몇 가지 C# 코드입니다?

+0

'Task.Delay (millisecondsDelay : 300) .Wait()'대나무화물 비행기입니까, 아니면 실을 잠자는 데 실제로 이점이 있습니까? – Will

+0

@Will,'Task.Delay'가'Thread.Sleep'보다 나은지 확실하지 않습니다. 이 질문을 적었을 때, 나는'Task.Delay'는 사람들이'Thread.Sleep'과 연관시키는 문제를 가지고 있지 않다고 생각했을 것입니다. 대나무 화물기 란 무엇입니까? – Sam

+0

https://en.wikipedia.org/wiki/Cargo_cult_programming Task.Delay는 async/await를 사용할 때 우수합니다. – Will

답변

0

지연없이 교착 상태 재 시도는 루프가 중지 될 때까지 활동으로 네트워크/디스크/데이터베이스를 '슬램'시킬 수 있습니다. 루프에 약간의 지연을 두는 것이 좋습니다. 다시 시도하기 전에 다른 트래픽이 먼저 통과 할 수있게합니다. 실제로 교착 상태를 해결해야 할 수도 있습니다.

0

진행을 기다릴 필요가 없습니다. 생존 한 상충되는 거래는 상충되는 거래가 주장하는 자물쇠를 부여했을 가능성이 큽니다.

다른 한편, 다른 트랜잭션은 여전히 ​​활성화되어있을 가능성이 있으며 비슷한 일을 할 수도 있습니다. 또 다른 교착 상태가 발생할 가능성이 있습니다. 작은 지연 후에 다른 트랜잭션이 현재 하나 일 수도 있고 다른 작업을 수행 중일 수도 있습니다.

재시도가 두 번째 시도에서 성공할 확률이 높습니다. 정확함을 요구하지는 않습니다.