[C#] 排除无须纳入交易的查询,避免产生不必要的分散式交易 (Distributed Transaction)

当不小心启用分散式事务机制时,且环境设定不允许时,就会产生【已停用分散式事务管理员 (MSDTC) 的网络存取。请使用组件服务系统管理工具启用 DTC,以使用 MSDTC 安全性设定中的网络存取】错误消息,此时可以透过?new TransactionScope(TransactionScopeOption.Suppress) 排除不需要纳入事务的部分,避免分散事务的情境产生。

前言



当操作不同 DB 服务器且需要在同一个事务下完成,就需要使用分散式事务(Distributed Transaction)来完成;在微软平台上 MSDTC (Distributed Transaction Coordinator)?是用来协调不同 DB 在单一事务下完成所有行为,但有时候我们不是真的需要这个功能,而是不小心启用这个机制,且环境设定不允许时,就会产生【已停用分散式事务管理员 (MSDTC) 的网络存取。请使用组件服务系统管理工具启用 DTC,以使用 MSDTC 安全性设定中的网络存取】错误消息,而这时候要怎样来排除呢? 请看以下实际的例子。

实例


目前系统使用两台 DB 做分流,一台 read / write 都可以,另外一台 read only 做数据查询使用;当执行功能时,需对数据库进行一连串的数据异动行为 (connect to read / write db),同时需要取出相关数据做参考 (connect to read only db),且为了确保所有异动在同一个事务完成,会将所有逻辑包在 transaction scope 中。

发生错误


程序执行下去就报错,错误消息表示目前服务器的设定并未启用 DTC 功能,因此若使用到分散式事务的机制就会产生该错误。


System.Transactions.TransactionManagerCommunicationException: 已停用分散式事务管理员 (MSDTC) 的网络存取。请使用组件服务系统管理工具启用 DTC,以使用 MSDTC 安全性设定中的网络存取。 ---> System.Runtime.InteropServices.COMException: 事务管理员已经停用了对远端/网络事务的支持。 (发生例外状况于 HRESULT: 0x8004D024)

错误排除


面对此案例来说,由于连线到 read only DB 所做的行为本来就不需要列入 transaction 中 (不对数据进行异动,且跟此次事务异动行为无关),但偏偏该行为却又穿插在各个异动行为中,这时就可以透过 TransactionScopeOption.Suppress 参数将无须纳入事务的部分再用 TransactionScop 包起来,避免分散事务的情境产生。示意代码如下。

参考资讯


.NET分散式事务程序开发FAQ



希望此篇文章可以帮助到需要的人

若内容有误或有其他建议请不吝留言给笔者喔 !

原文:大专栏  [C#] 排除无须纳入交易的查询,避免产生不必要的分散式交易 (Distributed Transaction)

原文地址:https://www.cnblogs.com/petewell/p/11516514.html

时间: 2024-10-07 00:39:44

[C#] 排除无须纳入交易的查询,避免产生不必要的分散式交易 (Distributed Transaction)的相关文章

错误描述: 抱歉,该商品的交易金额与原先的不一致,请重新创建交易付款。 错误代码: TRADE_TOTALFEE_NOT_MATCH

由于在支付宝最后支付,出现了问题导致未能支付成功,而支付宝已经记录了当前的网站订单号(out_trade_no),所以下次再以同一张订单进行支付时,就必须与之前的金额一致,否则就报上面的错. 解决方法就是,更改out_trade_no的值,所以这时你的订单需要有多个唯一标识. 错误描述: 抱歉,该商品的交易金额与原先的不一致,请重新创建交易付款. 错误代码: TRADE_TOTALFEE_NOT_MATCH,布布扣,bubuko.com 错误描述: 抱歉,该商品的交易金额与原先的不一致,请重新创

Bytom的链式交易和花费未确认的交易

当我们基于比原做应用的时候,在构建交易过程中会遇到以下两种情况.多个地址向一个地址转账,还有一种就是从一个地址分批次向多个地址转账.那我们今天就来介绍一下这两种交易构建的具体流程,以及贴出具体实现的代码. 链式交易 当我们从多个钱包地址一次性转到一个地址的时候,为了提高用户体验.我们可以选择链式交易,把多笔交易一次性打包.那我们下面就来看一下链式交易的流程. 接下来我们来看一下build-transaction接口的代码实现过程,代码如下: // POST /build-chain-transa

银行管理系统 实现用户注册 登录 存、取款 交易记录查询和修改用户信息等功能

========= 项    目   介   绍======== 银行账户管理系统 本项目主要实现用户注册 登录 存.取钱和修改用户信息功能. 用户信息的存储和获取通过集合和IO输入输出流实现. 存钱 取钱功能通过修改用户信息中的余额实现 修改用户信息 要先获取用户信息 ,再把修改后的信息保存到List中,同时必须删除原有的用户信息. ========项目功能需求============= 该银行管理系统可以实现 以下主要几个功能 用户注册   注册成功才能进行用户登录 用户登录  登录成功后

CSS3媒体查询入门,制作自己的响应式导航

现今每天都有更多的手机和平板电脑问市.消费者能够拥有可想象到的各种规格和形状的设备,但是网站开发人员却面临一个挑战:如何使他们的网站在传统浏览器.手机和平板电脑浏览器上有很好的效果,如何在各种大小的屏幕上提供一流的用户体验,答案是:采用响应式设计.响应式设计可以随所显示的屏幕大小而改变.实现响应式设计的主要方法是使用 CSS 媒体查询.--摘自IBMdeveloperworks 相信大家很多人都了解Bootsrap这个响应式框架,简单来说,该框架根据不同的分辨率提供非常友好的浏览体验,里面的核心

python量化交易入门学习 之用 Python 实现你的量化交易策略 实现之优矿使用

优矿 https://uqer.io/labs 注册 登录 在“开始研究”页面,新建一个 Notebook,就可以开始用 Python 写你自己的策略. 入门文档 数据  https://uqer.io/data/browse/0/?page=1 DataAPI.EquGet(secID=u"",ticker=u"",equTypeCD=u"A",listStatusCD=u"",field=u"",pan

微信支付-商户调用支付接口失败,已完成交易接口升级的用户应使用新接口进行交易;

微信支付出现如此问题: 这个是苹果手机会爆出的提示: 安卓手机和苹果手机通过JSAPI支付 JS弹出的res.err_msg:都会出现一下错误: 以上的原因为: 使用扫码登录获取用户信息的openid 不能做为公众平台JSAPI支付的openid : 不保证是唯一原因,但是至少这个会造成以上错误:

dns (域名系统)

dns (域名系统) DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析).DNS协议运行在UDP协议之上,使用端口号53.在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明. 中文名 域名系统 外文名

Vue中使用matomo进行访问流量统计的实现

Vue中使用matomo进行访问流量统计 原文链接 前言 之前做到了一个页面及接口访问流量统计的需求, 然后在网上找了很多帖子,发现有些有的但是写的都不是很详细,所以今天就整理了一下 正文 第一步 首先自然是引入matomo npm i vue-matomo 复制代码 第二步 在main.js中注册一下matomo import VueMatomo from 'vue-matomo' Vue.use(VueMatomo, { host: 'http://matomo.na.xyz', // 这里

Kademlia、DHT、KRPC、BitTorrent 协议、DHT Sniffer

catalogue 0. 引言 1. Kademlia协议 2. KRPC 协议 KRPC Protocol 3. DHT 公网嗅探器实现(DHT 爬虫) 4. BitTorrent协议 5. uTP协议 6. Peer Wire协议 7. BitTorrent协议扩展与ut_metadata和ut_pex(Extension for Peers to Send Metadata Files) 8. 用P2P对等网络思想改造C/S.B/S架构的思考 0. 引言 平常我们高端用户都会用到BT工具来