使用TransactionScope()进行事务管理

3
我需要创建一个简单的dotnet应用程序,该程序将在循环内调用存储过程(存储过程接受几个参数并将它们添加到表中)。要求是要么全部行插入成功,要么全部不插入。
为确保这一点,我已经使用了:
using (TransactionScope scope = new TransactionScope())
{
    foreach (EditedRule editedRules in request.EditedRules)
    {
            ...stored procedure call
    }
}

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

如果有更好的方法,我也会很感激。


将您的代码放在 try catch 块中,以便您可以实现回滚场景。并确保调用 scope.Complete() - Amit Kumar Ghosh
3个回答

5
假设您的存储过程没有创建并提交自己的事务,那么这段代码将会运行成功,只需要做一处修改:在using块结束前,您的代码需要添加scope.Complete()代码;否则,事务将会被回滚。
using (TransactionScope scope = new TransactionScope()) {
    foreach (EditedRule editedRules in request.EditedRules) {
         ...stored procedure call
    }
    scope.Complete(); // <<== Add this line
}

这个结构的想法是只有在块正常退出时,即在处理循环过程中没有异常,才会调用Complete。如果抛出异常,scope会检测到并导致事务回滚。

2
还要注意隔离级别 https://msdn.microsoft.com/zh-cn/library/ms173763.aspx - Bikal Bhattarai

2

关于你的代码,我唯一需要指出的是要确保执行scope.Complete()以提交事务:

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

   scope.Complete();
}

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


0

我想这就是你要找的:

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

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