2

我得到了一个看起来像这样的服务组件(不是我写的):

[Transaction(TransactionOption.Required, Isolation = TransactionIsolationLevel.Serializable, Timeout = 120), EventTrackingEnabled(true)]
public class SomeComponent : ServicedComponent
{
    public void DoSomething()
    {
        try
        {
            //some db operation
        }
        catch (Exception err)
        {
            ContextUtil.SetAbort();
            throw;
        }
}

真的ContextUtil.SetAbort()需要吗?当组件离开时,异常不会中止事务吗?

4

1 回答 1

2

仅当您想手动管理事务时。

[AutoComplete]如果您以这种方式使用属性装饰您的操作,您的组件将自动投票中止(以防引发任何异常)或提交:

[AutoComplete]
public void DoSomething()

编辑:

有关此属性的详细信息,请参阅此处的 MSDN

如果方法调用正常返回,事务会自动调用 SetComplete。如果方法调用抛出异常,则事务被中止。

无论如何,如果您(在极少数情况下)确实需要手动管理交易,那么不要让您的交易受到质疑,这一点非常重要。我在您的代码中缺少ContextUtil.SetComplete();应该显式调用的代码。

于 2012-10-18T12:24:19.717 回答