2

나는 MS-DTC가 나는 TransactionScope에 내에서 하나 개 이상의 연결이MSDTC 및 격리 수준

1) (격리 수준 아래에 주어진 시나리오에서 동작하는 방법을 몇 가지 설명이 필요

a) MS-DTC는 격리 수준을 SERIALIZABLE로 자동 변경합니다.

b) (Imp) 위의 대답이 예이고 Row 버전 기반 격리 수준 (예 : TransactionScope)을 구현 한 경우 READ_COMMITTED_SNAPSHOT 데이터베이스 옵션을 "사용"으로 설정 했으므로 유효하게 유지됩니다 "직렬화 가능"격리 수준.

void OuterMethod() { 
    TransactionOptions tso = new TransactionOptions(); 
    tso.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; 
    using (TransactionScope tx = new TransactionScope(TransactionScopeOption.RequiresNew, tso)) { 
     InnerMethod("select * from testtable"); 
     InnerMethod("update testtable set col1 = N'new value'"); 
     tx.Complete(); 
    } 
} 

static void InnerMethod(string sqlText) { 
    using (SqlConnection conn = SqlConnection(connStr)) { 
     conn.Open(); 
     SqlCommand cmd = conn.CreateCommand(); 
     cmd.ExecuteNonQuery(); 
    } 
} 

감사

답변

2

직렬화는 기본 격리 수준이지만 MS DTC will respect the Isolation Level you specify in your TransactionOptions입니다.

UPDATE는

1) 예, MS DTC가 포함됩니다.

1a) 아니요 (위 참조).

1b) 이전 대답은 예가 아니지만 READ_COMMITTED_SNAPSHOT은 격리 수준이 커밋 된 것으로 읽혀진 경우에만 적용됩니다. 다른 격리 수준은 자체 잠금 모델을 시행합니다. "When the READ_COMMITTED_SNAPSHOT option is set to ON, read operations under the read committed isolation level are based on row versions and are executed in a nonlocking mode."

+0

자세한 내용은 다른 답변 – Buzz