使用TransactionScope()进行事务管理

本文关键字:事务管理 TransactionScope 使用 | 更新日期: 2023-09-27 18:03:30

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

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

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

我从来没有使用过TransactionScope之前,有人可以让我知道如果这个代码将工作,将我所有的行回滚。

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

使用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块中出现任何异常,事务将被回滚。

我想这就是你要找的:

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