gpt4 book ai didi

c# - transactionscope 是否得到妥善处理?

转载 作者:行者123 更新时间:2023-11-30 15:58:02 25 4
gpt4 key购买 nike

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

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

try/catch 是否在 using 语句内执行? transactionScope 是否妥善处置?

请注意,这个问题是关于 try/catch block 是否在 using 上下文中执行的。我问是因为 try/catch 代码周围没有大括号。

最佳答案

重读后,我意识到我错过了真正的问题。

是的,try/catchusing block “内”,即使 using 语句没有大括号。

如果一个 block 没有大括号,那么该 block 隐含地只包含紧邻的下一个语句或 block

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

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

或者这个

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

两者完全相同。

为了可读性,我通常会添加大括号。我认为它更清晰一些,不了解语法细节的人不会感到困惑。


是的,在您的代码中,TransactionScope 总是被释放。

通过将其放在 using block 中 and 调用 Dispose,如果出现异常,Dispose 会被调用两次.它在 catch block 中调用一次,并在 using block 结束时再次调用。 (这不会抛出异常,但这是不必要的。)

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

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

关于c# - transactionscope 是否得到妥善处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43944170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com