.NET开发问题记录——TransactionScope出错:“与基础事务管理器的通信失败”的解决方法

news2024/10/6 10:25:49

文章目录

  • 前言
  • 问题产生
    • 使用TransactionScope进行事务控制
  • 分布式事务(Distributed Transaction Coordinator)未开启原因
    • 该伙伴事务管理器已经禁止了它对远程/网络事务的支持。
  • System.Transactions.TransactionManagerCommunicationException: 与基础事务管理器的通信失败。
      • 重点:以上关于DTC的配置是需要数据库服务器和项目部署的服务器都要进行配置的。
        • .NET分布式事务为什么要数据库端和客户端都要开启DTC
  • 总结
    • DTC内容
      • 定义
      • 功能
      • 参与者
      • 配置和管理
      • 事务参与方式
    • TransactionScope
      • 使用步骤
      • 展示TransactionScope的使用:
      • 注意事项和要点

前言

最近在做.NET项目,使用的是SQLServer数据库,其中有个功能涉及到多数据源的操作,那么多数据源就要确保多个数据源之间数据的一致性,这里就用到了分布式事物。

问题产生

使用TransactionScope进行事务控制

 //开启事物
                using (TransactionScope scope = new TransactionScope())
                {
                    List<BatchProcessedEntity> batchProcessings = new List<BatchProcessedEntity>();

                    //将电子束的订单插入到电子束的数据源中
                    using (PMSEBEAMContext electronBeamContext = new PMSEBEAMContext())
                    using (PmsTestEntities pmsTestEntities = new PmsTestEntities())
                    using (PMSContext xRayContext = new PMSXRAYContext())
                    {

                            //查询电子束数据库中订单信息
                            List<BatchProcessedEntity> electronBeamList = electronBeamContext.BatchProcessedEntity.ToList();
                            //放入集合中
                            batchProcessings.AddRange(electronBeamList);
                            //从电子束数据库的数据源中删除
                            electronBeamContext.BatchProcessedEntity.RemoveRange(electronBeamList);
                            electronBeamContext.SaveChanges();

                            //查询X射线数据库中订单信息
                            List<BatchProcessedEntity> xRayList = xRayContext.BatchProcessedEntity.ToList();
                            //放入集合中
                            batchProcessings.AddRange(xRayList);
                            //从X射线数据库的数据源中删除
                            xRayContext.BatchProcessedEntity.RemoveRange(xRayList);
                            xRayContext.SaveChanges();


                            //接收insert的受影响行数
                            int result = 0;
                            //插入到pms库中
                            pmsTestEntities.BatchProcessedEntity.AddRange(batchProcessings);
                            result = pmsTestEntities.SaveChanges();

                            //如果数据全部插入成功则返回true
                            if (result == batchProcessings.Count)
                            {
                                //提交事物
                                scope.Complete();
                                return;
                            }

                            throw new Exception("数据库同步失败");


                    }

分布式事务(Distributed Transaction Coordinator)未开启原因

该伙伴事务管理器已经禁止了它对远程/网络事务的支持。

在这里插入图片描述
在使用 TransactionScope 进行分布式事务时,确保分布式事务管理器(DTC)已启用并在运行。检查操作系统中的服务列表,确保 “Distributed Transaction Coordinator” 服务正在运行。一般情况下这个服务时开启状态的,如果没有开启则通过控制面板——管理工具——组件服务——服务找到Distributed Transaction Coordinator服务将其启动在这里插入图片描述
当然这些启动了还行,因为仅仅启动了服务,仍然会报该伙伴事务管理器已经禁止了它对远程/网络事务的支持的错误,这里还要做一步就是在组件服务——计算机——我的电脑——Distributed Transaction Coordinator这个层级下点击本地DTC鼠标右键属性在这里插入图片描述
打开属性窗口后我们直接到点击安全进入这个页面将安全设置中的选项进行勾选,可以参照我这个。
在这里插入图片描述
至此这个错误就解决了。

System.Transactions.TransactionManagerCommunicationException: 与基础事务管理器的通信失败。

在这里插入图片描述
可以看一下错误,这里说的是分布式事务失败给出了几个原因,我这里在解决这个问题的过程中也找了很多相关的内容,大致上的思路都是开放端口、开放服务,我这里贴一两篇大家可以看一下
关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法
【MSDTC】与基础事务管理器的通信失败 .NET分布式开发报错:“与基础事务管理器的通信失败”的解决方法
关于这个错误其实还是防火墙的问题,本人这次碰到的就是因为Windows的防火墙和linux的防火墙不一样的就是Windows它还能对一些应用进行限制,也就是说不仅仅是端口的问题,这里如果你根据上面两个博客做了相应的配置以后仍然出现通信失败的问题,那么你不妨打开防火墙点击这个允许应用通过Windows Defender防火墙进行通信进入里面。找到分布式事务处理协调器这个选项,将后面的网络类型勾选上,最后点击确定就可以了。
在这里插入图片描述
在这里插入图片描述

重点:以上关于DTC的配置是需要数据库服务器和项目部署的服务器都要进行配置的。

.NET分布式事务为什么要数据库端和客户端都要开启DTC

在使用.NET分布式事务时,确保数据库端和客户端都开启DTC(分布式事务协调器)的原因是确保跨多个数据库连接的事务能够正确地进行协调和管理。

分布式事务涉及多个参与者(例如数据库服务器、应用程序服务器等),每个参与者都可能有自己的事务资源。DTC是一个协调器,负责确保所有参与者在事务的上下文中工作,并协调它们之间的操作。

数据库端需要开启DTC,以便数据库服务器能够参与和管理分布式事务。数据库操作是通过数据库连接进行的,而数据库连接是由数据库驱动程序和底层的DTC进行协调和管理的。因此,数据库端的DTC需要启动并配置正确,以便与应用程序服务器上的DTC进行通信,并执行跨数据库连接的事务操作。

客户端也需要开启DTC,因为应用程序服务器上的DTC需要与数据库端的DTC进行通信,并协调事务的执行。客户端发起的事务操作需要与数据库端的DTC进行交互,以确保所有参与者都遵循事务的一致性、隔离性、持久性和原子性。

通过在数据库端和客户端都开启DTC,可以建立端到端的分布式事务环境,确保所有参与者在事务中的操作得到正确的协调和管理。这样可以保证分布式事务的可靠性和数据的一致性。

总结

DTC内容

DTC(分布式事务协调器)是用于管理分布式事务的组件,它负责协调多个参与者之间的操作,并确保事务的一致性、隔离性、持久性和原子性。下面是关于DTC的一些基本内容:

定义

DTC是Microsoft Windows操作系统的一个组件,用于协调分布式事务。它提供了一个可靠的机制,确保多个参与者在分布式环境中的事务操作能够一致地协调和执行。

功能

DTC提供以下功能:

  • 事务协调:DTC协调多个参与者之间的事务操作,确保它们按照事务的隔离级别和一致性规则执行。

  • 锁管理:DTC管理事务中的锁资源,以保证并发访问的正确性和一致性。

  • 日志记录和恢复:DTC记录事务的操作日志,并在需要时支持事务的回滚和恢复。

  • 分布式事务管理:DTC能够管理涉及多个数据库或资源的分布式事务,确保它们能够以原子方式一起提交或回滚。

  • 事务超时和回滚:DTC监视事务的执行时间,并在超时或错误发生时执行事务的回滚操作。

参与者

在分布式事务中,可能涉及多个参与者,包括数据库服务器、应用程序服务器、消息队列、文件系统等。每个参与者都需要与DTC进行通信,并遵循DTC的协调和管理。

配置和管理

DTC的配置和管理可以通过操作系统的组件服务来完成。通过组件服务管理界面,可以设置DTC的参数、安全性选项、网络访问权限等。正确的配置和管理DTC对于确保分布式事务的可靠性和一致性至关重要。

事务参与方式

在.NET中,可以使用TransactionScope类来实现分布式事务。通过创建TransactionScope对象,可以将多个操作包装在同一个事务中,并使用DTC进行协调和管理。

需要注意的是,使用DTC来管理分布式事务可能涉及到性能、安全性和配置方面的考虑。合理的使用和配置DTC,以及遵循最佳实践,对于确保分布式事务的可靠性和性能至关重要。此外,对于跨多个数据库或资源的分布式事务,还需要确保参与者的支持和兼容性。

TransactionScope

TransactionScope是.NET Framework中用于管理事务范围的类。它提供了简化的方式来执行原子性事务,确保多个操作要么全部成功提交,要么全部回滚。

使用步骤

TransactionScope,需要按照以下步骤进行操作:

  1. 创建TransactionScope对象,并在代码块的开始处进行初始化。
  2. 在事务代码块中执行需要参与事务的操作,如数据库操作、文件操作等。
  3. 如果所有操作都成功执行,并且没有抛出异常,则事务在代码块结束时自动提交。
  4. 如果任何一个操作失败或抛出异常,则事务被回滚,以保证所有操作的一致性。

展示TransactionScope的使用:

using (TransactionScope scope = new TransactionScope())
{
    try
    {
        // 执行数据库操作
        using (SqlConnection connection1 = new SqlConnection(connectionString1))
        using (SqlCommand command1 = new SqlCommand(query1, connection1))
        {
            connection1.Open();
            command1.ExecuteNonQuery();
        }
        
        // 执行文件操作
        File.WriteAllText(filePath, content);

        // 提交事务
        scope.Complete();
    }
    catch (Exception ex)
    {
        // 处理异常
        Console.WriteLine("Error: " + ex.Message);
    }
}

注意事项和要点

  • TransactionScope可以嵌套使用,内部的嵌套事务将自动加入外部事务的范围。
  • 默认情况下,TransactionScope使用可分布式事务协调器(DTC)来管理分布式事务,因此需要确保数据库端和客户端都已开启DTC。
  • 长时间运行的操作或过多的资源使用可能导致事务范围过长,影响性能。
  • 在事务代码块中,应该捕获并处理异常,以便正确处理事务状态。
  • 调用TransactionScope的Complete()方法来标记事务的成功,否则事务将回滚。

总的来说,TransactionScope提供了一种方便且可靠的方式来管理事务的范围,使多个操作能够以原子性的方式执行,确保数据的一致性。使用TransactionScope可以简化事务管理的代码,并提供了异常处理和自动回滚的机制,使开发人员能够更容易地处理复杂的事务操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Reference Doc

场景&#xff1a; reference doc 是springboot官方文档

【C++入门编程常见问题】(小白必看)

常见问题 vsstudio快捷键 快速注释组合键 ctrlk ctrlc 取消注释快捷键 ctrlk ctrl u 支持垃圾回收机制 大多数面向对象编程语言具有垃圾回收机制。早期的C语言不具备垃圾回收机制&#xff0c;这意味着申请的内存资源在使用完成后&#xff0c;需要程序员自己释放。直到C11标…

springcloud-alibaba (01)linux下Nacos单节点安装和部署

Nacos 一&#xff0c;下载解压 Nacos二&#xff0c;使用外部存储器&#xff08;可选&#xff09;三&#xff0c;Nacos配置四&#xff0c;防火墙配置五&#xff0c;启动nacos 一&#xff0c;下载解压 Nacos 首先确保你的系统上已经安装了 Java&#xff0c;可以运行以下命令检查&…

B站C语言学习,颠覆谭浩强C语言,可能是最好的C语言视频 【自用笔记】

文章目录 数据类型字符&#xff0c;整型&#xff0c;浮点型sizeof 展示字节大小 变量 常量变量变量&#xff1a;全局变量 /局部变量变量的使用变量的作用域和生命周期 常量const修饰的常变量#define定义的标识符常量枚举常量 数据类型字符&#xff0c;整型&#xff0c;浮点型si…

[LitCTF 2023] crypto,pwn,rev

这个比赛有巨多的题&#xff0c;而且基本上都很简单&#xff0c;队里答疯了。其实没大意思&#xff0c;本来不想写了&#xff0c;可又没啥可写&#xff0c;这周也就干点这个&#xff0c;算是放松吧。 Crypto 1,HEX 略 2,梦想是红色的&#xff0c;略 3&#xff0c;原来你也玩…

es7.x 通过java api实现常规操作

一 es7.x 1.1 配置pom文件 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch的客户端 -->&…

Springboot启动失败 DB连不上竟然是maven配置的问题

Springboot启动失败&#xff1a;Failed to instantiate [javax.sql.DataSource]。 最开始以为是DB版本后&#xff0c;需要升级驱动版本&#xff0c;但更新驱动版本还是不行&#xff0c;而且另外一个项目同样驱动同样配置可以启动。 后面发现代码读取不到yml文件中的配置信息。…

zigbee MQTT控制小米蓝牙插座开和关 型号Xiao Mi zigbee ZNCZ02LM 或支持zigbee的插座或设备

zigbee MQTT控制小米蓝牙插座开和关 型号Xiao Mi zigbee ZNCZ02LM 或支持zigbee的插座或设备 硬件准备 小米蓝牙插座&#xff0c;型号: Xiao Mi zigbee ZNCZ02LM 或支持zigbee的插座或设备 zigbee设备&#xff0c;型号: CC2531设备 参考链接: https://github.com/Koenkk/zi…

Linux高并发服务器开发01:Linux系统编程入门

GCC 什么是GCC GCC工作流程 GCC常用的参数选项 GCC和G的区别 静态库 什么是库 静态库的制作 先编译生成对应的.o文件 gcc -c add.c sub.c mult.c div.c -I …/include/ 再将.o文件打包成静态库 ar rcs libcalc.a add.o sub.o mult.o div.o 使用的时候-l指定库名称 gcc main.c…

[C++]AVL树、红黑树以及map、set封装

目录 前言&#xff1a; 1 AVL树 1.1 AVL树的概念 1.2 AVL树结点的定义 1.3 AVL树插入 1.4 插入结点的调整 1.5 AVL树的旋转调整 1.5.1 右单旋 1.5.2 左单旋 1.5.3 左右双旋 1.5.4 右左双旋 1.5.4种旋转的判断方式 2 红黑树 2.1 红黑树概念 2.2 红黑树与AVL树的比…

路径规划算法:基于飞蛾扑火算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于飞蛾扑火优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于飞蛾扑火优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Linux基本指令-3

文章目录 一、 d a t e date date [选项] 格式1、常用选项&#xff1a;2、运用实例&#xff1a; 二、 c a l cal cal [选项] [年份]1、常用选项&#xff1a;2、运用实例&#xff1a; 三、 f i n d find find[路径] [ − n a m e ] [-name] [−name] 文件名1、…

消息推送平台有没有保证数据不丢?

我们在使用mq的时候&#xff0c;就会很自然思考一个问题&#xff1a;怎么保证数据不丢失&#xff1f; 现在austin接入层是把消息发到mq&#xff0c;下发逻辑层从mq消费数据&#xff0c;随后调用对应渠道接口来下发消息。 消息推送平台&#x1f525;推送下发【邮件】【短信】【…

001 - STM32固件库编程

STM32固件库编程 一、新建工程文件夹 1、工程文件夹内添加&#xff1a;Project、Libraries、User、Doc&#xff0c;之后在Project目录内新建工程&#xff0c;并将标准库中CMSIS、STM32F4xx_StdPeriph_Driver复制到Libraries中。 2、将\STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Pr…

Hbase基础介绍-1 概述

Hbase基础介绍-1 概述 一、概述1、定义&#xff1a;2、特点&#xff1a;3、HBase在Hadoop生态中的地位4、HBase与HDFS5、Hbase与Hive6、关系型数据库与列式数据库7、结构化数据和非结构化数据8、HBase使用场景9、CAP定理10、Hbase与传统关系型数据库的区别 一、概述 1、定义&am…

飞腾D2000 如何修改boot启动项

开机后,按着F2进入如下界面 选择Enter Setup 选择 Boot Maintenance Manager 进入Boot Options 选择Change Boot Order 在这个界面按 键盘上的 Enter 键 在弹出得蓝色小方框里,按键盘的上下键,比如我要把硬盘盘符放在boot 启动项的第一首选项,则移动下键到硬盘盘符上,再…

嵌入式系统入门基础知识分析(二)

目录 ​编辑 1、GPIO原理与结构 2、A/D接口 3、D/A接口基本 4、键盘接口

解密网站401错误:了解发生原因和修复方法

​  每个网站都会有不同的错误码&#xff0c;其中&#xff0c;401错误被认为是相对常见的错误码。那么&#xff0c;什么是网站401错误呢?在摸清了这一点之后&#xff0c;我们也需要学习一下如何解决它。 什么是 401 状态码? 401 状态代码是 Web 服务器发送给浏览器的 HTTP …

【小菜鸡刷题记】--字符串篇

【小菜鸡刷题记】&#xff1a;字符串 剑指 Offer 05. 替换空格剑指 Offer 58 - II.左旋转字符串剑指 Offer 20.表示数值的字符串剑指 Offer 67. 把字符串转换成整数 特此声明&#xff1a;题目均来自于力扣 剑指 Offer 05. 替换空格 题目链接 请实现一个函数&#xff0c;把字符…

【JUC基础】06. 生产者和消费者问题

1、前言 学习JUC&#xff0c;就不得不提生产者消费者。生产者消费者模型是一种经典的多线程模型&#xff0c;用于解决生产者和消费者之间的数据交换问题。在生产者消费者模型中&#xff0c;生产者生产数据放入共享的缓冲区中&#xff0c;消费者从缓冲区中取出数据进行消费。在…