.NET中关于TransactionScope的问题

3
using (TransactionScope scope = new TransactionScope())
{
    int updatedRows1 = custPh.Update(cust.CustomerID, tempPh1, 0);
    int updatedRows2 = custPh.Update(cust.CustomerID, tempPh2, 1);
    int updatedRows3 = cust.Update();

    if (updatedRows1 > 0 && updatedRows2 > 0 && updatedRows3 > 0)
    {
        scope.Complete();
    }
}

以上的TransactionScope代码结构是否正确?这是我第一次使用它,所以我尽量让它简单易懂。


1
你使用得很好。根据您的要求,您可能需要确保加入/不加入环境事务。您可以使用TransactionOptions参数来设置它们。http://simpleverse.wordpress.com/2008/08/05/using-transactionscope-for-handling-transactions/ - Mike Atlas
@Mike。你应该创建一个答案,因为它是正确的。 - Steven
1
其实,我认为那篇文章可能已经过时了,Mike。TransactionScope不再只是DTC的包装器,这使它更加可用:https://dev59.com/1kjSa4cB1Zd3GeqPF4Pb - Brian MacKay
为了进一步解释Mike的评论,TransactionScope的默认IsolationLevel是Serializable(我曾经认为它是ReadCommitted,并对发生的数据库死锁感到非常惊讶)。可以通过TransactionOptions结构参数来设置IsolationLevel以传递给TransactionScope构造函数。Mike所指的是TransactionScopeOption枚举参数。 - Dan Terry
1个回答

8

锁定很好,

但你的做法是不好的设计。 如果不是每个表都有更新的行,你基本上是在执行回滚操作。 你永远不会知道事务是否完成或失败。这可能会使解决错误变得痛苦。

如果出现问题,我更喜欢抛出异常。那也会导致回滚,因为永远不会到达scope.Complete()。

using (TransactionScope scope = new TransactionScope())
{
    int updatedRows1 = custPh.Update(cust.CustomerID, tempPh1, 0);
    int updatedRows2 = custPh.Update(cust.CustomerID, tempPh2, 1);
    int updatedRows3 = cust.Update();

    if (updatedRows1 == 0 || updatedRows2 == 0 || updatedRows3 == 0)
        throw new Exception("Not all rows could be updated");

    scope.Complete();
}

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