나는 다음과 같은 방식으로 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이 트랜잭션이 롤백되었음을 보장합니까'라는 질문을 다시 할 수 있습니다.
TransactionAbortedException의 InnerException이 시간 초과입니까? –
'InnerException'만이'COMMIT TRANSACTION 요청에 상응하는 BEGIN TRANSACTION.가 없습니다. '트랜잭션이 교착 상태로 롤백되었을 때'scope.Complete'를 호출하기 때문에 이것을 얻고 있습니다 – wal
이것을 시도하십시오 if .Current.TransactionInformation.Status == TransactionStatus.Committed) { scope.Complete(); } 어떤 목적으로 –