2009-08-12 8 views
1

단일 트랜잭션에서 많은 데이터베이스 업데이트를 수행하는 흥미로운 상황을 다루고 있습니다. 어떠한 이유로 든 이러한 업데이트가 실패하면 트랜잭션은 롤백됩니다.IDbTransaction 롤백 시간 초과

IDbTransaction transaction 
try { 
    transaction = connection.BeginTransaction(); 

    // do lots of updates (where at least one fails) 

    transaction.Commit(); 
} catch { 
    transaction.Rollback(); // results in a timeout exception 
} finally { 
    connection.Dispose(); 
} 

위의 코드는 일반적으로 트랜잭션 내에서 데이터베이스 업데이트를 수행하기위한 표준 템플릿으로 간주됩니다.

내가 직면 한 문제는 transaction.Rollback()이 SQL Server에 발급되는 동안 클라이언트에서도 시간이 초과된다는 것입니다.

롤백 명령을 실행하기위한 시간 초과와 실행을 완료하는 해당 명령의 시간 초과를 구별 할 수 있습니까? 사전에

감사합니다, 벤

답변

0

당신은 던져 다른 예외 봐 특히 어획량 즉를 지정해야합니다. sql 명령을 처리하는 동안 오류가 발생하면 SqlException을 throw하여 프로젝트에서 다른 예외를 catch하십시오.

은 더욱 더 당신은 또한

예외 잡기 및 프로그램 수 - 트랜잭션을 커밋하는 동안 오류가 발생했습니다.

InvalidOperationException - 트랜잭션이 이미 커밋되거나 롤백되었습니다. - 또는 - 연결이 끊어졌습니다.

앤드류

+0

나는 transaction.Rollback() 메서드 호출의 문서화되지 않은 시간 제한 예외 (그리고 다른 사람을) 잡을 수 있지만, 정확히 어떻게 내가 롤백이 발생 여부 알 수 있어야합니다. 두 가지 시나리오에서 타임 아웃 예외가 발생할 것이라고 생각합니다. 롤백 명령이 SQL Server에 발급 될 수없는 경우 첫 번째이고 롤백 명령이 실행 된 경우 두 번째 SQL Server가 너무 오래 걸리는 경우 ... –

+0

위 예제의 추가 구현을 보았습니다. 롤백 메서드 호출이므로 여기서 롤백 프로 시저 자체가 던진 예외를 catch합니다. 다시 이것은 롤백 할 수 없으면 SQL 예외 일 수 있습니다. 예외는 특정 트랜잭션 관련 오류에 대한 시간 초과 또는 잘못된 연산으로 간주합니다. –