2016-10-21 2 views
7

나는 다음과 같은 방식으로 TransactionScope을 사용하고 트랜잭션이 이미 롤백되었습니다로 scope.Complete()를 호출 할 때 TransactionAbortedException - 안전하게 다시 실행할 수 있습니까?

using (var scope = new TransactionScope()) 
{ 
    using (var conn = SQLHelpers.GetSQLConnection()) 
    { 
      //commands here 
    } 
    scope.Complete(); 
} 

때때로 내가 TransactionAbortedException을 얻고 내가 문제를 결정하기 위해 프로파일 러를 사용한 것은 교착 상태입니다.

예외 트랜잭션 (프로세스 ID 59)이 다른 프로세스와 잠금 리소스에 교착 상태가되어 교착 상태 희생자로 선택되었습니다. 트랜잭션을 재실행하십시오.

내가했습니다 발견 된 교착 상태의 원인, 그러나 그것은이 오류가 그래서 실제로 그냥 특정 사건에 대한 트랜잭션을 다시 실행 할 수있는 TransactionAbortedException까지 거품하지 않았다 왜 나를 궁금해 가지고 있기 때문이다. 내부 예외에는 실제 오류가 무엇인지 나타내는 정보가 포함되어 있지 않습니다.

TransactionAbortedException을 트랜잭션을 다시 실행하는 이유로 탐지해도 안전한가요? 3)
4 '연결이 종료 된'

1) 교착 상태
2) 시간 초과) ... 기타 :

은 최대 지금은 다음과 같은 내부 예외를 보았다 하는가?

이러한 경우에만 트랜잭션을 다시 실행하는 것이 적절하지만 롤백이 보장된다면 모든 경우에이를 일반화 할 수 있습니다. 이 질문은 'TransactionAbortedException이 트랜잭션이 롤백되었음을 보장합니까'라는 질문을 다시 할 수 있습니다.

+0

TransactionAbortedException의 InnerException이 시간 초과입니까? –

+0

'InnerException'만이'COMMIT TRANSACTION 요청에 상응하는 BEGIN TRANSACTION.가 없습니다. '트랜잭션이 교착 상태로 롤백되었을 때'scope.Complete'를 호출하기 때문에 이것을 얻고 있습니다 – wal

+0

이것을 시도하십시오 if .Current.TransactionInformation.Status == TransactionStatus.Committed) { scope.Complete(); } 어떤 목적으로 –

답변

3

문제 '트랜잭션이 다시 압연 된 보장 TransactionAbortedException 을한다'물어 다시 언급 될 수 있을까?

TransactionAbortedException에 대한 문서는 말한다 : 작업이 이미 예를 들어, 다시 압연 된 하는 거래에 시도 할 때 호출 할 때

이 예외가 발생합니다 Commit 이미 시간이 초과 된 트랜잭션의 메소드. 이 예외는 트랜잭션을 커밋하려고 시도하고 트랜잭션이 중단 될 때 발생합니다.

복구 할 수있는 오류입니다.

나는 당신이이 예외를 잡을 경우, 트랜잭션은 몇 가지 이유로 인해 성공적으로 완료되지 않았 음이 설명에서 꽤 분명하다 생각합니다. 문서에 대한 나의 이해는 다음과 같습니다. "트랜잭션의 변경 내용이 데이터베이스에 커밋되지 않았습니다."

"복구 할 수있는 오류입니다."따라서 트랜잭션의 특성이 재 시도하는 것이 바람직한 경우이 예외를 포착 한 후에 다시 시도해야합니다.

다시 시도하기 전에 잠시 기다리는 등의 재 시도를 둘러싼 논리를 소개하고자 할 수 있습니다. 그리고 재시도 횟수가 늘어남에 따라이 대기 시간을 늘리십시오. 재 시도의 총량 또는 총 재시도 시간에 제한을두고 재 시도하려는 모든 시도가 실패 할 때 정상적인/실패한 작업을 정상적으로 수행하십시오.

관련 문제