繁体   English   中英

使用TransactionScope()进行事务管理

[英]Transaction management using TransactionScope ()

我需要创建一个简单的dotnet应用程序,它将在循环内调用存储过程(存储过程接受几个参数并将它们添加到表中)。 要求是所有行都插入或非插入。

为了确保这一点,我使用过:

using (TransactionScope scope = new TransactionScope())
{
    foreach (EditedRule editedRules in request.EditedRules)
    {
            ...stored procedure call
    }
}

我之前从未使用过TransactionScope ,有人可以告诉我这段代码是否有效,并且我的所有行都会被回滚。

如果有更好的方法,我也将不胜感激。

假设您的存储过程不创建并提交自己的事务,此代码将起作用,只需进行一处更改:您的代码需要在using块结束之前编写scope.Complete() ; 否则,交易将回滚。

using (TransactionScope scope = new TransactionScope()) {
    foreach (EditedRule editedRules in request.EditedRules) {
         ...stored procedure call
    }
    scope.Complete(); // <<== Add this line
}

这个构造背后的想法是,只有当块正常退出时才会调用Complete ,即处理循环时没有异常。 如果抛出异常, scope将检测到它,并导致事务回滚。

我要对你的代码提出的唯一要求是确保执行scope.Complete()以提交事务:

using (TransactionScope scope = new TransactionScope())
{
   foreach (EditedRule editedRules in request.EditedRules)
   {
       // stored proc
   }

   scope.Complete();
}

如果在使用块期间发生任何异常,则将回滚该事务。

我想这就是你要找的东西:

using (var transaction = conn.BeginTransaction()) {
    try 
    {
       transaction.Commit();
    }  
    catch 
    {
        transaction.Rollback();
        throw;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM