C# 事务中的事务

2024-05-10

我正在使用 C# 将发票的平面文件导入到数据库中。如果遇到问题,我将使用 TransactionScope 回滚整个操作。

这是一个棘手的输入文件,因为一行不一定等于一条记录。它还包括链接记录。发票将包含标题行、行项目和总计行。有些发票需要跳过,但我可能不知道需要跳过,直到达到总行数。

一种策略是将标题、行项目和总行存储在内存中,并在达到总行后保存所有内容。我现在正在追求这个。

然而,我想知道是否可以用不同的方式来完成。围绕发票创建“嵌套”事务,插入标题行和行项目,然后在达到总行数时更新发票。如果确定需要跳过发票,则此“嵌套”事务将回滚,但整个事务将继续。

这可能、实用吗?您将如何设置?


既没有TransactionScopeSQL Server 也不支持嵌套事务。

你可以筑巢TransactionScope实例,但仅具有嵌套事务的外观。实际上,存在一种称为“环境”事务的东西,并且一次只能有一个。哪个交易是环境交易取决于你的用途TransactionScopeOption当您创建范围时。

要更详细地解释,请考虑以下事项:

using (var outer = new TransactionScope())
{
    DoOuterWork();

    using (var inner1 = new TransactionScope(TransactionScopeOption.Suppress))
    {
        DoWork1();
        inner1.Complete();
    }

    using (var inner2 = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        DoWork2();
        inner2.Complete();
    }

    using (var inner3 = new TransactionScope(TransactionScopeOption.Required))
    {
        DoWork3();
        inner3.Complete();
    }

    outer.Complete();
}

以下是每个内部作用域发生的情况:

  • inner1在隐式事务中执行,独立于outer。没有发生在DoWork1保证是原子的。如果中途失败,您将获得不一致的数据。无论发生什么,这里发生的任何工作都将始终致力于outer.

  • inner2在新事务中执行,独立于outer。这是一个不同的交易来自outer但它是not嵌套的。如果失败,发生的工作outer (DoOuterWork())并且任何其他范围仍然可以提交,但问题是:如果完成,则回滚整个outer交易将not回滚内部完成的工作inner2.这就是为什么它不是真正嵌套的。还,inner2将无权访问由以下锁定的任何行outer,所以如果你不小心的话,你可能会陷入僵局。

  • inner3执行于same交易为outer。这是默认行为。如果DoWork3()失败并且inner3永远不会完成,那么整个outer事务被回滚。同样,如果inner3成功完成但是outer被回滚,然后完成的任何工作DoWork3()也被回滚。

所以你可以希望看到这些选项实际上都不是嵌套的,并且不会给你你想要的东西。这Required选项近似于嵌套事务,但不使您能够独立提交或回滚事务内的特定工作单元。

SQL Server 中最接近真正的嵌套事务的是SAVE TRAN声明结合一些TRY/CATCH块。如果您可以将逻辑放入一个或多个存储过程中,这将是一个不错的选择。

否则,您需要按照 Oded 的建议对每张发票使用单独的交易记录。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 事务中的事务 的相关文章

  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 如何将 webmethod 与 telerik 批量编辑网格一起使用

    Work on Asp net vs2012 C telerik RadGrid batch edit I put save button outside from the grid Under the save button want t
  • 线程独占数据:如何存储和访问?

    NET 中是否有可能将对象实例绑定到线程的当前执行上下文 这样在代码的任何部分我都可以做类似的事情CurrentThread MyObjectData DoOperation 并确保我访问特定于线程的数据 谢谢 你可以看一下线程静态属性 h
  • t sql中的相对路径?

    如何获取t sql中的相对路径 举个例子 sql文件位于文件夹中D temp 我想获取文件夹中文件hello txt的路径D temp App Data 如何使用相对路径引用 假设我正在 SQL Server Management Stud
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 如何在 SQL Server 中什么都不做[重复]

    这个问题在这里已经有答案了 可能的重复 T SQL 中的空语句 https stackoverflow com questions 3234871 empty statement in t sql 我怎样才能让它在 SQL Server 中
  • 从数据库配置中的连接字符串中删除 SSIS 密码

    我有一个 SSIS 包 它使用 SQL 服务器中的 SSIS 配置表来检索 OLE DB 连接管理器的连接字符串属性 问题是我还需要相同的连接字符串来调用使用实体框架的程序集 我尝试访问连接管理器连接字符串属性 但 SSIS 总是删除密码
  • 使用生成的 Golang DLL 返回字符串或 *C.Char

    我一直在努力追随z505 goDLL https github com z505 goDLL回购并遇到了一个大问题 该方法无法返回字符串 我无法读取结果的输出变量 这是我到目前为止使用的代码 Go 完整代码https play golang
  • 使用 TCP 时是否需要使用校验和来保护我的消息?

    使用 TCP 作为网络协议 在通过线路发送消息之前 我会为每条消息的大小 以及可能的校验和 添加前缀 我想知道 计算和传输消息的校验和是否有意义 以确保消息将被不变地传递 如果以及何时传递 例如因为一些网络错误 目前 我在发送消息本身之前发
  • 更改 NHibernate Session.Save 命令超时

    我们有几个长时间运行的后端进程 其运行时间超过默认的 30 秒 我们的NHibernate版本是2 0 1 4000 Spring NET是1 2 0 20313 NHibernate 通过 Spring NET 进行配置
  • SQL - 为每条记录调用存储过程

    我正在寻找一种方法来为 select 语句的每条记录调用存储过程 SELECT SomeIds SELECT spro Id FROM SomeTable as spro INNER JOIN Address addr ON addr Id
  • 使用 HttpClient 从 webapi 消费 xml

    我使用 WebClient 从 Restfull 服务 net web api 获取 Xml 对象 一切都运行良好 using WebClient client new WebClient client Encoding UTF8Encod
  • SQL Server Express 到 .mdf 文件的连接

    两部分问题 我使用 VS 2015 Update 3 创建了一个 ASP NET MVC 5 应用程序 我在本地计算机上完成了该项目 突然 我无法再通过 SQL Server 对象资源管理器连接到 mdf数据库文件并出现以下错误 无法打开数
  • .Net 6 控制台应用程序:WebApplication.CreateBuilder 与 Host.CreateDefaultBuilder

    我正在研究 NET 6 并希望构建一个简单的控制台应用程序 并进行一些依赖项注入 据我所知 为了使启动 现在只是程序 文件更具可读性 已经做了很多工作 让我有点困惑的是 所有改进似乎都是针对 API 项目中使用的 WebApplicatio
  • SQL Server 相当于 MySQL 的 USING

    在 MySQL 中 当您连接不同表中具有相同名称的列时 可以在连接中使用关键字 USING 例如 这些查询产生相同的结果 SELECT FROM user INNER JOIN perm USING uid SELECT FROM user
  • SQL Server 转换选择一列并将其转换为字符串

    是否可以编写一条从表中选择列并将结果转换为字符串的语句 理想情况下 我希望有逗号分隔的值 例如 假设 SELECT 语句看起来像这样 SELECT column FROM table WHERE column lt 10 结果是一列包含值的
  • 如何找出我的 MS SQL Server 排序规则是什么?

    是否有我可以执行的 SQL 来找出答案 服务器默认排序规则 select serverproperty collation 哪个是相同的 select databasepropertyex master collation Check 服务
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 将多行合并为一行并根据行数附加列

    我正在尝试将同一个表的多行合并为一个 我有一个像这样的示例表 Col1 Col2 Col3 Col4 Col5 Col6 1 BH1 CB 12 CC CC Conveyor Mal 1 BH1 CB 104 ZC ZC Full Emp
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr

随机推荐