【C#编程最佳实践 十五】DTC使用最佳实践

最近由于校验工具出现bug,但无法定位问题,又涉及到数据库的创建和更新,所以在武哥的帮助下,学习了下DTC,也就是分布式事务协调管理,主要解决事务完整性问题和提供自动修复功能。当然现在我只涉及到了监测功能,修复功能需要运维的配合。

函数原型

当一个函数对数据库执行多步操作需要保证其完整性的时候(同时数据的复杂性也会导致某些执行成功,某些失败,不一定是逻辑错误,当然如果百分百执行不到下一步,很有可能逻辑错误

fun(storevalue){

  dtc(order1,storevalue)    //初始化参数,如果只有order1得到了增长,则表明 step1fun()执行失败
  step1fun()===========执行完之后产生参数A

  dtc(order2,storevalue)  //第一步函数执行后参数,如果order1和order2得到了增长,order3没有增长,则表明 step2fun()执行失败
  step2fun()===========执行完之后产生参数B

  dtc(order3,storevalue)  //第二步函数执行后参数,如果order1、order2和order3得到了增长,order4没有增长,则表明 step3fun()执行失败
  step3fun()===========
  dtc(order4,storevalue) //第三步函数执行后参数,如果order1、order2、order3和order4都得到了增长,则表明 全部执行成功

}

数据巴士

这里写图片描述
上边的函数部分可以图形化为上图,也就是上下文数据再不断膨胀,但在每一步执行完时候都会将下一个步骤执行所需的数据序列化存储到DTC日志,方便复现当时场景。

线上监测

这里写图片描述

线上发现order1执行了3次,而order2只执行了2次,说明step1fun()有一次执行失败,同时,order4只执行了1次,说明,step3fun()有两次执行失败,当四次执行都成功的时候,每一个order都抵消1

注意:这里不光是自己的代码要写完,还要往配置里加东西,具体来说我从本地代码往运维的数据库里存入数据,运维不管是在什么环境下,只要有配置文件就可以依赖其从自己的库里读取数据,所以我只需要给运维他需要的配置就行,数据库(不管是线上还是测试)大家都能看到,他也不用关心我的代码实现。

如果步骤都执行完了,完成数加1,如果有没有执行完的,流程中各步数量柱状图会有所不同
这里写图片描述

发布了244 篇原创文章 · 获赞 116 · 访问量 18万+
展开阅读全文

分布式事务MSDTC 启动了,.net控制台程序使用2个dbcontext的时候依然报错

11-29

控制台程序错误信息:MSDTC on server 'XXXXX' is unavailable. 数据库错误信息:The Microsoft Distributed Transaction Coordinator (MS DTC) service could not be contacted. If you would like distributed transaction functionality, please start this service. 开发环境: 操作系统: windows 10 pro x64 数据库系统: Microsoft SQL Server 2014 (SP1-GDR) (KB4019091) - 12.0.4237.0 (X64) Jul 5 2017 22:03:42 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.3 <X64> (Build 18362: ) 数据库和控制台程序都在个人电脑 分布式服务和防火墙配置截图: MSDTC服务启动 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995782_642605.png) MSDTC 组件属性配置 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995797_251778.png) 防火墙关闭 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995826_764792.png) 防火墙允许app添加msdtc ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995879_144770.png) 防火墙入栈规则添加msdtc ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995895_969597.png) 防火墙出栈规则添加msdtc ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995909_46026.png) 使用subinal 授予network service账号msdtc权限 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995918_986824.png) 数据库服务器实例连接属性勾选MSDTC选项 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995935_62133.png) .net 控制台程序和app.config截图 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995957_297876.png) ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995969_569268.png) 数据库日志错误信息截图 ![图片说明](https://img-ask.csdn.net/upload/201911/29/1574995981_100861.png) 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 点我我会动 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览