2012-01-13 3 views
4

"scope"라는 트랜잭션을 롤백하려고하지만 scope2라는 내부 트랜잭션을 롤백해서는 안됩니다. 그러나 그들은 양쪽 다 되돌아 간다! !! TransactionScopeOption.Suppress 옵션이 작동하지 않습니다 ...TransactionScopeOption.Suppress가 있지만 중첩 된 트랜잭션 롤백

이미 DTC를 사용할 수 있으며 Visual Studio 2010과 .net 4.0 및 Microsoft SQl Server 2008을 사용하고 있습니다. 무엇이 잘못 되었습니까 ???

using (SqlConnection conn = new SqlConnection(@"Data Source=.\DEVELOPER;Initial Catalog=TestDatenbank;Integrated Security=sspi")) 
     { 

      using (TransactionScope scope = new TransactionScope()) 
      { 

       conn.Open(); 

       SqlCommand cmd = new SqlCommand(); 
       cmd.Connection = conn; 

       cmd.CommandText = "UPDATE Orders SET ID='111'"; 
       cmd.ExecuteNonQuery(); 


       using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress)) 
       { 

        SqlCommand cmd1 = new SqlCommand(); 
        cmd1.Connection = conn; 

        cmd1.CommandText = "UPDATE Orders SET OrderName='aaa'"; 
        cmd1.ExecuteNonQuery(); 


        scope2.Complete(); 
       } 


       //scope.Complete(); 

      } 

     } 

답장을 보내 주셔서 감사합니다.

마침내 작동합니다!

using (SqlConnection conn = new SqlConnection(@"Data Source=.\DEVELOPER;Initial Catalog=TestDatenbank;Integrated Security=sspi")) 
     { 

      using (TransactionScope scope = new TransactionScope()) 
      { 

       conn.Open(); 

       SqlCommand cmd = new SqlCommand(); 
       cmd.Connection = conn; 

       cmd.CommandText = "UPDATE Orders SET ID='111'"; 
       cmd.ExecuteNonQuery(); 

       using (SqlConnection conn2 = new SqlConnection(@"Data Source=.\DEVELOPER;Initial Catalog=AdventureWorks;Integrated Security=sspi")) 
       { 
        using (TransactionScope scope2 = new TransactionScope(TransactionScopeOption.Suppress)) 
        { 

         conn2.Open(); 

         SqlCommand cmd1 = new SqlCommand(); 
         cmd1.Connection = conn2; 

         cmd1.CommandText = "UPDATE Henrik SET ID='111'"; 
         cmd1.ExecuteNonQuery(); 


         scope2.Complete(); 
        } 
       } 


       //scope.Complete(); 

      } 

     } 

하나 개 이상한 것은, 내가이 줄 scope2.Complete()를 삭제할 때; //scope.Complete();를 바꿉니다. scope.Complete();

범위 scope2 다시

하지만 롤백됩니다 실행됩니다 실제로 : 나는 다음과 같은 예상 범위가 scope2도

어떤 아이디어 실행됩니다 실행됩니다 ???????

답변

2

확실하지는 않지만 억제 기능을 사용하여 주변 트랜잭션을 억제해도 외부 범위와 동일한 연결을 사용할 수 있습니다. 따라서 연결은 이미 트랜잭션 (외부 트랜잭션)에 참여하므로 모든 변경 사항이이 트랜잭션에 바인딩됩니다. 내부 범위에 주변 트랜잭션이 없다는 사실은 차이를 만들지 않을 수도 있습니다. 즉, 억제 범위는 여기서는 아무 것도하지 않습니다.

TransactionScope에 내부 논리를 실행하고 RequiresNew을 사용하고 새 연결을 사용해 볼 수 있습니다.

1

별도의 연결에서 2 개의 트랜잭션 범위를 만들어보십시오. SQL 수준에서 트랜잭션은 연결 수준에서 '범위가 지정됩니다.'