2012-01-13 1 views
4

"scope"という名前のトランザクションをロールバックしたいが、scope2という内部トランザクションをロールバックしないでください。しかし、彼らは両方のロールバック!オプションTransactionScopeOption.Suppressが機能しません...TransactionScopeOption.Suppressがネストされたトランザクションロールバック

私はすでにDTCを有効にしていますが、.NET 4.0とMicrosoft SQl Server 2008でVisual Studio 2010を使用しています。 何が問題なのですか?

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(); 

      } 

     } 

1つの奇妙なことは、私がscope2.Complete()行を削除するときです。 //scope.Complete();を置き換えます。スコープで.Complete();私は、次のことを期待:

範囲は scope2が戻っ

が、実際にロールバックされますが実行されます。 スコープは scope2に実行されます。また、

任意のアイデアを実行されます???????

答えて

2

わかりませんが、抑制を使用してアンビエントトランザクションを抑制しても、外側のスコープと同じ接続を使用することができます。したがって、接続は既にトランザクション(外部​​トランザクション)に参加しており、すべての変更はこれにバインドされています。内部スコープ内にアンビエントトランザクションが存在しないという事実は、違いを生じさせないかもしれない。つまり、抑制範囲はここで何もしません。

TransactionScopeで内部ロジックを実行し、新しい接続でRequiresNewを使用してみることができます。

1

別の接続で2つのトランザクションスコープを作成してみてください。 SQLレベルでは、トランザクションは接続レベルごとに「スコープ」されます。

関連する問題