事务范围(TransactionScope)是否被正确处理?

4

我在我们代码库中寻找一个可能存在的问题,开发人员忘记用大括号括起来 using 语句的内容:

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

try/catch代码块是否在using语句内执行?事务范围是否被正确处理?

请注意,这个问题与try/catch块是否在using上下文中执行有关。我之所以问,是因为try/catch代码没有大括号包围。


1
在事务中,您不需要使用try-catch来管理事务的完整性。 - OmG
1
可能是Using block vs IDisposabe.Dispose()的重复问题。 - Fran
我的问题特别涉及到花括号的使用,而不是如何使用/idisposable。 - Alex Gordon
1
应该加上大括号以清楚地表达哪些内容是 using 块的一部分吗?在我看来,当然是需要的。在这种情况下,try/catch 部分是否属于 using 块?是的。而 catch 中的 Dispose() 调用是多余的。这意味着整个 try/catch 块完全没有意义,因为它除了不必要的 Dispose() 调用之外,只是重新抛出异常。 - itsme86
1
当没有花括号时,下一条语句将成为代码块的主体。在这种情况下,主体是TRY/CATCH。但在您的示例中,您实际上不需要所有这些开销。您正在使用try/catch来管理事务范围,然后只是重新抛出原始错误。您可以将try catch删除并将两个语句作为主体放置在USING内。 - Sean Lange
2个回答

2
重新阅读后,我意识到错过了实际问题。
是的,即使using语句没有大括号,try/catch也在其中。
如果一个块没有大括号,那么隐含地该块仅包括紧接着的下一条语句或块。
所以使用另一个例子,你可以这样做:
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
Try/Catch语句块在using块内执行。您的代码与以下代码完全相同:
using (TransactionScope transactionScope = new TransactionScope(Transaction.Current))
{
      try
      {
           RecordUserConnectionCore(context, userName);
           transactionScope.Complete();
      }
      catch
      {
          transactionScope.Dispose();
          throw;
      }
}

有一些理由可以证明这是真实的,其中之一是因为

transactionScope.Dispose(); 

line compiles.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接