4

我在 TransactionScope 中使用两个 SQLConnection 这个(伪)代码是否正确?

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
  {
     using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
       {
         (...)
       }

     using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
        {
           (...)
        }

     ts.Complete();
   }

还是我应该使用这个?

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
  {
     using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
       {
         (...)
         using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
          {
             (...)
             ts.Complete();
          }
       }
   }

第一个代码更好,因为它允许我在方法中提取命令。但是我担心的是,在这种情况下,连接是在范围完成之前被处理的,对 TransactionScope 的登记是否足以防止这种情况发生?

4

4 回答 4

1

在您的第一个示例中,两个连接都在调用 ts.Complete() 之前处理,这不是问题,因为 ts.Complete() 方法不使用连接:

  • 两个连接都在此方法中本地声明,并且超出任何其他方法的范围
  • 连接不会传递给 ts.Complete() 方法以将它们带入范围

在您的第二个示例中,当两个连接仍然存在时调用 ts.Complete() 方法,但是,它们没有传递给该方法,因此不能使用。

这意味着这两种方法都将同样有效,并且在调用 ts.Complete() 之前是否处理连接无关紧要。

于 2013-03-20T15:01:31.570 回答
1

Complete嵌套连接处理后调用完全没有问题。事务的生命周期故意大于 SQL 连接的生命周期,并且您可以继续与它进行交互,而不受任何其他连接的生命周期的影响。

所以是的,在您的第一个示例中,您Complete在连接处理后调用,这很好

您可以根据Transaction Scope文档中的示例以及this page on how to use transaction scopes看到,在连接被释放后可以完成事务。

于 2013-03-20T15:21:55.980 回答
0

在 MSDN 网站上看起来第二个是要使用的...

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx(见第一个例子)

于 2013-03-20T15:00:35.350 回答
0

还有第三种可能:

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
{
    // ...
    ts.Complete()
}
于 2013-03-20T15:01:01.620 回答