2012-01-13 119 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水平,交易是在每个连接的水平“作用域”。