2013-08-09 13 views
1

아래 그림과 같이 격리 수준을 읽기 미확인으로 설정합니다. 연결이 내가 디자인 (The transaction isolation level is not reset when you reuse a connection from the connection pool)에 의해 이해는 다시 기본 격리 수준으로 다시 설정되지 않습니다 풀에 반환되면트랜잭션 스코프를 사용할 때 격리 수준 재설정

TransactionOptions to = new TransactionOptions(); 
    to.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; 
    using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.RequiresNew, to)) 
    { 
     // Do Stuff 
     transaction.Complete(); 
    } 

문제는있다. 따라서 트랜잭션이 완료되면 풀에서 해당 연결을 다시 사용하는 모든 항목이 읽기 커밋되지 않은 격리 수준으로 실행됩니다.

"SET TRANSACTION ISOLATION LEVEL READ COMMITTED" SqlCommand를 사용하여 전화를 걸었지만 풀에서 동일한 연결을 다시 사용할 수 있음을 보장 할 방법이 없습니다. // Do Stuff의 아무 것도 기본 연결을 노출하지 않습니다.

이 코드가 이전에 실행 된 경우에 대비하여 DB에 대한 모든 호출에 명시 적으로 설정하지 않고 격리 수준을 재설정하는 방법이 있습니까?

답변

1

I concerned myself with this problem a while ago. 짧은 대답 : 좋은 해결책이 없습니다. 명시된 트랜잭션 하에서 모든 것을 실행하는 것이 최선의 방법이라고 생각합니다. 보장 된 격리 수준을 제공하기 때문입니다. 절대 암시 적 트랜잭션을 사용하지 마십시오.

4

이 트랜잭션 범위 내에서 사용하는 연결에 대해 다른 connection string (아마도 Pooling을 false로 설정하거나 Application Name을 사용하지 않음)을 사용합니다. 그렇게하면이 연결은 다른 연결에 대한 (다른 | 아니오) 풀로 끝나며 다른 코드에 의해 실수로 선택 될 수 없습니다.

+0

이것은 우리가 사용하는 접근 방법입니다. 추가하는 공백으로 "단순한"것으로 연결 문자열을 '다르게'만들고 따라서 다른 풀에 빠지게됩니다. 코드는 앰비언트 범위 분리를 검사하여 사용할 CS를 결정합니다. 어떤 수단으로도 완벽한 것은 아니지만, 아무 것도 아닌 것보다 낫습니다. – user2864740