2012-01-13 124 views
4

我想回滾一個名爲「範圍」,但內部事務命名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

我不知道是肯定的,但原因可能是,儘管你用抑制抑制任何環境事務,您使用相同的連接作爲外部範圍。因此,該連接已經參與一個事務(外層一個)等的所有變化都結合於此。在內部範圍內沒有環境交易的事實可能沒有什麼區別。換句話說,抑制範圍在這裏不會做任何事情。

您可以嘗試使用RequiresNew和新連接在TransactionScope中運行內部邏輯。

1

嘗試創建2事務範圍上的不同的連接。在SQL水平,交易是在每個連接的水平「作用域」。