transactioncope是否得到妥善处理?

时间:2017-05-12 18:18:04

标签: c# sql .net sql-server visual-studio

我在代码库中发现了一个可能的问题,开发人员忘记用curley括号包装using语句的内容:

        using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
            try
            {
                RecordUserConnectionCore(context, userName);
                transactionScope.Complete();
            }
            catch
            {
                transactionScope.Dispose();
                throw;
            }

try / catch是否在using语句中执行? transactionScope是否正确处理?

请注意,这个问题与try / catch块在using context中执行有关。我问,因为try / catch代码周围没有大括号。

2 个答案:

答案 0 :(得分:2)

重新阅读后,我意识到我错过了实际的问题。

是的,即使try/catch语句没有括号,using仍在using块内。

如果一个块没有大括号,那么该块只包含下一个语句或block

所以使用另一个例子,你可以这样做:

if(x = 1)
{
    try{}
    catch{}
}

或者

if(x=1)
try{}
catch{}

两者完全相同。

为了便于阅读,我通常会添加大括号。我认为它有点清晰,不知道语法细节的人不会混淆。

是的,在您的代码中TransactionScope总是被处置掉。

将其放入using调用Dispose,如果出现异常,Dispose会被调用两次。它会在catch块中调用一次,并在using块的末尾再次调用。 (这不会引发异常,但这是不必要的。)

using块意味着即使出现异常,transactionScope也已被处置。所以你可以这样做:

using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
{
    RecordUserConnectionCore(context, userName);
    transactionScope.Complete();
}

答案 1 :(得分:1)

Try / Catch正在使用块内执行。您的代码与您拥有以下代码完全相同:

using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
{
      try
      {
           RecordUserConnectionCore(context, userName);
           transactionScope.Complete();
      }
      catch
      {
          transactionScope.Dispose();
          throw;
      }
}

您可以知道这是真的原因之一是因为

transactionScope.Dispose(); 

行编译。