c# - 事务管理使用TransactionScope()

标签 c# asp.net .net sql-server

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

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

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

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

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

最佳答案

假设您的存储过程不创建和提交它自己的事务,此代码可以工作,只需做一个更改:您的代码需要编码 scope.Complete()using block 结束之前;否则,事务将回滚。

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

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

关于c# - 事务管理使用TransactionScope(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517441/

相关文章:

c# - 根据两个字段记住密码

c# - .NET Standard 1.6 中的 System.Threading.Tasks.Parallel 在哪里?

C# TCP 客户端到服务器消息

c# - 可以将代码从 Web 表单传递到 View 吗? (C#)

asp.net - 如何在不使用数据库中的主键的情况下为用户提供唯一 ID?

c# - 当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery 要求命令具有事务

.net - 网络服务 : Should returning or passing enums be avoided?

.net - LINQ 到 SQL 交叉应用

c# - 在 RDLC 报告中处理数组和聚合

c# - 使用颜色代码从 Gridview 导出到 excel