如何检测是否发生了回滚?

2023-11-24

我正在寻找大型业务应用程序中的错误,其中业务流程失败但部分保留到数据库中。更难以弄清楚的是,该过程每隔几周才会失败一次,每次失败之间都会成功处理数十万次。当并发/工作进程数量增加时,错误频率似乎会增加。

到目前为止,我们已经能够通过该程序重新创建我们所看到的内容。 (.NET 4.7.1框架)

using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    using (var sqlConnection = new SqlConnection("Server=localhost;Database=Database1;Trusted_Connection=True"))
    {
        sqlConnection.Open();

        // Doing some unwanted nested manual transaction and rolling it back
        var transaction = sqlConnection.BeginTransaction();
        new SqlCommand($"INSERT INTO TestTable VALUES('This will be rolled back}')", sqlConnection).ExecuteNonQuery();

        transaction.Rollback();

        // Now doing some work with the DB.
        // You might expect it to become a part of transactionScope, but that is NOT the case!
        // So this command will actually succeed, with data written to the DB.
        new SqlCommand($"INSERT INTO TestTable VALUES('This will be inserted')", sqlConnection).ExecuteNonQuery();

        // Doing something which promotes the local transaction to a distributed transaction.
        using (var sqlConnection2 = new SqlConnection("Server=localhost;Database=Database2;Trusted_Connection=True"))
        {
            // The program will fail here, with message "The transaction has aborted, Failure while attempting to promote transaction."
            sqlConnection2.Open();

            new SqlCommand($"INSERT INTO TestTable2 VALUES('We will never come this far')", sqlConnection2).ExecuteNonQuery();

        }
    }
    transactionScope.Complete();
}

我们的生产代码没有明确调用transaction.Rollback(),在我的示例中,它只是作为重现错误消息和行为的手段。但如果我们的任何第三方库进行此调用,我想抛出异常并尽快退出。最好是在应用层。

我怎样才能检测到调用Rollback()已经做了?我真的不想在不确定的情况下进行粗略操作transactionScope能够完成它的工作。

Update 1

我不想要的“回滚”是由 .Net 连接共享机制中的某个错误引起的。该错误在 4.5.1 和 4.8 之间的所有 .Net Framework 版本以及新版本上都会重现。System.Data.SqlClient包.

An 问题已添加到 System.Data.SqlClient 存储库中.


不同的事务 API 并不都能一起工作。所以你现在正处于危险的境地。

如何检测是否已调用 Rollback()?

select @@trancount应该总是告诉你。回滚会将 @@trancount 恢复为 0。

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

如何检测是否发生了回滚? 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 为什么基类必须有一个带有 0 个参数的构造函数?

    这不会编译 namespace Constructor0Args class Base public Base int x class Derived Base class Program static void Main string a
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • p5.j​​s 中的碰撞处理

    我一直在使用 p5 js 并且已经弄清楚如何让对象来检测碰撞 但我对如何处理这些碰撞感到非常困惑 我尝试将玩家速度设置为 0 但随后玩家卡住了 我也尝试过将碰撞分开到每一侧 但这也不起作用 这是我的带有碰撞函数的玩家构造函数 class P
  • React CSS 模块的几个 CSS 文件

    我有2个相同的组件 它们的样式有点不同 所以我想重用通用样式 但不想为它们使用全局CSS 我该如何实现呢 import React from react import commonStylesfrom common table css im
  • 有没有在react-native中实现JavaScriptModule的指南?

    有兴趣直接实施native to javascript调用react native 但没有找到任何指南 请帮助提供一些在 React Native 中创建和注册本机 JavaScript 模块的示例 已经从官方那里找到了代码原生模块 and
  • 如何在 Oracle 的 SQLData.writeSQL() 中将 java.sql.Array 写入 java.sql.SQLOutput

    我已经实施了java sql SQLData为了使用 ojdbc6 将 UDT 对象绑定到准备好的语句 现在 我的一些 UDT 包含数组 我现在需要做的是 class MyType implements SQLData public voi
  • 批量:删除文件扩展名

    我有来自维基百科的以下批处理脚本 echo off for R C Users Admin Ordner f in flv do echo f pause 在 for 循环中 所有扩展名为 flv 的文件都会得到回显 但我想对文件进行一些操
  • 在 Perl 中对非常大的数字执行数学运算

    我遇到的情况是 数据文件中的某些值具有 64 位环绕 这使得它们非常大 例如 18446744073709551608 所以我必须对 2 64 进行减法 我用简单的方法尝试了这个 2 64 18446744073709551608 但我猜这
  • 从字符串创建 MySQL SET

    有没有办法在 MySQL 中从一串分隔值创建一个集合 例如 快速的棕色狐狸 gt 那个 快速 棕色 狐狸 一种没有位调整的逆 EXPORT SET Regards 如果您尝试在IN语句 您可以进行如下比较 而不是拆分字符串 SELECT F
  • 如何在 sp2013 中使用 REST api 将用户添加到共享点列表项用户字段?

    我有一个基本的共享点列表 其中包含人员字段 现在我尝试使用 REST API 添加新的列表项 并尝试将人员字段设置为我的别名 但它不起作用并引发以下错误 看起来我的用户数据传递方式有问题 但我无法在线找到任何帮助 你们能否帮助我们以正确的方
  • Spring引导登录到多个文件

    有什么方法可以根据配置将 Spring Boot 日志记录配置到多个文件 控制台 即某些日志语句应写入审核文件 而普通日志语句应写入控制台 普通日志文件 下面是我在 Spring Boot 示例应用程序上尝试过的代码 logback spr
  • 如何更改android中溢出菜单的背景颜色

    我想更改溢出弹出菜单的背景颜色以匹配主屏幕的背景 有谁知道我该怎么做 Thanks 如果您使用工具栏 首先需要将此行添加到工具栏布局中 app popupTheme style ThemeOverlay MyTheme 它应该看起来像这样
  • 日期时间可以为空吗?

    如何为可为空的日期时间创建 setter 和 getter 属性 例如 private DateTime mTimeStamp public DateTime TimeStamp get return mTimeStamp set mTim
  • PHP 检查日期是否是过去 30 天

    我这里有点问题 我将日期插入数据库 date last applied 我可以通过使用来调用它 row date last applied 当然 现在 我需要检查这个插入的日期是否是30 天前如果是 则执行一个操作 query SELECT
  • 在同一域上使用 nginx 为多个节点应用程序提供服务

    我想使用来自同一域的 nginx 托管 2 个不同的节点应用程序 但遇到了一些麻烦 我想拥有 mydomain com指向节点应用程序firstApp and otherapp mydomain com指向节点应用程序otherapp 现在
  • 删除指针和将其设置为 nullptr 之间有什么区别? [复制]

    这个问题在这里已经有答案了 正在说delete pointer and pointer nullptr相同 可能不会 但是后者会释放内存吗 关于什么delete pointer pointer nullptr pointer nullptr
  • “创建像 Flip3D 这样的应用程序”的 API 是什么?

    我试图弄清楚如何使用 DWM 将窗口的副本渲染到我自己想要的位置 我唯一能找到的告诉 DWM 在某处渲染的方法是使用缩略图 API 但MSDN的DWM 缩略图概述他们特别警告我 NoteDWM 缩略图不允许开发人员创建类似的应用程序 Win
  • ctor 和 setter 参数的命名约定

    对于那些命名成员变量时没有特殊符号的人 例如m foo or foo 如何为 ctor 和 setter 命名参数 到目前为止我尝试过的一些选项 Obj int foo foo foo void set foo int foo this g
  • 使用 JQuery 将表格单元格转换为文本框

    我有一个表 如下所示 table tbody tr th Name th th Value nbsp span style color Blue font size 6 Edit span th th Type th tr tr td st
  • 显式模板实例化 - 何时使用?

    休息几周后 我试图通过这本书来扩展和扩展我对模板的知识模板 完整指南由 David Vandevoorde 和 Nicolai M Josuttis 编写 我现在想要理解的是模板的显式实例化 我实际上对该机制本身没有问题 但我无法想象我想要
  • 按钮和链接的字体大小

    我尝试了这个简单的html TEST FONT SIZE
  • 如何检测是否发生了回滚?

    我正在寻找大型业务应用程序中的错误 其中业务流程失败但部分保留到数据库中 更难以弄清楚的是 该过程每隔几周才会失败一次 每次失败之间都会成功处理数十万次 当并发 工作进程数量增加时 错误频率似乎会增加 到目前为止 我们已经能够通过该程序重新