事务使用中如何避免误用分布式事务

C# 事务- TransactionScop 类 如何使用 注意:在多数据库或多资源操作的场景下,可能需要确保MSDTC(Microsoft Distributed Transaction Coordinator)服务已经启动并正确配置,因为。可能会提升为分布式事务。此外,根据你的数据库访问模式和.NET版本,你可能需要调整事务的隔离级别或超时设置。命名空间下,用于简化跨多个资源管理器(如数据库连接)的事务处理。以下是一个基本的使用示例,展示了如何使用。来确保一系列操作的原子性,即这些操作要么全部成功,要么全部失败。 阅读详情

1:本地事务DbTransaction和分布式事务TransactionScope的区别:

1.1:System.Data.Common.DbTransaction:

本地事务:这个没什么好说了,就是单个事务,每种数据库都有自己的实现,事务的深度内涵可以搜索查看相关的文章,不是本文介绍的重点。

1.2:System.Transactions.TransactionScope:

分布式事务,需要添加引用System.Transactions,同时启用MSDTC分布式事务服务:通常使用方式为:

复制代码
  using (System.Transactions.TransactionScope ts =  new System.Transactions.TransactionScope())
 {
                 // 代码块A
                
// 代码块B
                ts.Complete(); // 提交事务
 }
复制代码

分布式事务本质上是引入了第三方裁判,来想办法对多个本地事务监控同时成功或同时失败,这里分享几个知识点:

A:如果代码块里,若存在两个或以上数据库链接DbConnection,则需要启动微软的MSDTC分布式事务服务。

用命令行启动或停止服务:

 

B:如果代码块里,只有一个数据库链接DbConnection,那么实际上只是本地事务在处理,就算MSDTC分布式事务服务没启动,也不会报错。

C:对于TransactionScope包含的代码块,本质是监控了代码块里数据库链接DbConnection的个数,如果有多个不同的对象,则引入MSDTC当裁判,而实际执行的事务的还是各个本地事务。

D:MSDTC总是不够稳定,我在测试时两个简单的事务一起时,按住F5不停刷新,竟然能把MSSQL服务也给挂了,而用本地事务就算跨库也不会有问题。

 

所以,不是必须的情况,尽量不要引入分布式事务,应该避免使用TransactionScope来包含事务块的冲动。 


2:可以用本地事务解决,避免使用分布式事务场景:

2.1:项目只有一个数据库,这个是最应该避免,多个表间的事务, 完全是本地事务可处理的范围:

问题:一个代码块里N个实体类杂交操作,每个实体类带有各种的数据库链接,从而引发了MSDTC。

可以:共用一个DbConnection对象,来避免启用MSDTC。

 

2.2:项目多个数据库,如果数据库间使用了相同的访问账号和密码,这种情况也可以避免:

每种数据库有自己的解决方式:像MSSQL,跨库处理只要加前缀(dbname..tablename)就可以,因此也使的只使用本地事务就可以处理了。

 

3:回顾下我以前的项目场景:

3.1:从下图是我08年在中域的项目:有19个数据库,对于数据库链接而言,唯一的不同只有数据库的名称:

 

进化:能不能只保留一条,其它的通过动态切换数据库名称来改链接字符串?

 

3.2:那时候,我的架构还是很新手,通过CodeSmith生成了大量的代码文件:

实体类项目,工厂项目,接口项目,数据操作,还有大量的增删改查存储过程,只是为了基础的增删改查而且只针对MSSQL。

随便展开一个项目都会看到大量的文件夹,里面有大量的文件,而这些东东,都是代码生成器的杰作:

 

19个数据库啊,NN个表,光生成这些基本的增删改查,整个项目就好像高端大气上档次了。

进化:能不能消灭这些大量的文件,简单是我们不断追求的目标。

 

3.3:这么多数据库,如何跨数据库事务?

对于生成的大量的实体,每个表的操作都是一个新的链接,单库间的事务都必须MSDTC了,更别说19个库间的跨库事务了。

进化:能不能本地事务搞定这些,这是每个ORM可以思考的方向。

 

4:CYQ.Data 提供的解决方案: 

为了消灭上述的那些大量的生成文件,我在后续新的公司写了传统的ORM框架:XQData(这个框架一直没露过面,也只是支持MSSQL,用反射消灭了好多层,只留下实体层)。

对于框架的演进,多数都来源于项目中遇到的问题,或复杂的场景,需要解决或者简化,才有了不断升级的可能,并不是无中生有,因此,一个框架,如果不能不断在在项目中实战,那么很多问题和细节等可能都无法发现,更新也会遥遥无期。 

而CYQ.Data的不断升级,说明我一直在奋战在一线的编码生涯中和网友各大项目中的实战反馈中。 

 

下面针对最近的优化调整,演示下CYQ.Data是怎么解决上面提到的几个问题:

4.1:多个数据库的数据库链接切换:

A:先用配置工具生成针对多数据库的枚举文件,和成demo和test两个数据库:

两个数据库就生成两次了。

B:配置一个默认的链接字符串,到Demo数据库:

<add name= " Conn " connectionString= " server=.;database=demo;uid=sa;pwd=123456 "/>

C:打印操作Test数据库表的链接字符串:

using (MAction action =  new MAction(TestEnum.Users))
            {
                Console.WriteLine(action.ConnectionString);
            }

输出:

 

这里自动切换了数据为名称为新的链接,而我动手脚的地方就是在枚举的名称了。

4.2:本地多数据库跨事务,示例:

复制代码
            AppDebug.OpenDebugInfo =  true;
            AppDebug.Start();
             using (MAction action =  new MAction(DemoEnum.Users))
            {
                 action.BeginTransation();//开启事务
                 action.Fill( 12);
                Console.WriteLine(action.ConnectionString);//打印数据库链接
                action.ResetTable(TestEnum.Users);//切换数据库
                Console.WriteLine(action.ConnectionString);//打印数据库链接
                action.Fill( 12);
                action.EndTransation();
            }
            Console.WriteLine(AppDebug.Info);//输出所有执行的SQL语句。
            AppDebug.Stop();
复制代码

输出的结果:

 

说明:在事务中,当检测到事务开启时,为了使用本地事务,并没有切换数据库,而是采用了前缀来执行操作。
 

 

如果注释掉代码中的事务,则是直接切换数据库链接,输出会如下图:

 

说明:如果没有开启事务,则直接切换了数据库链接,并消消灭前缀语法。

总结:

对于.NET领域,微软除了提供这个不太稳定的MSDTC,似乎没有发现其它分布式事务的解决方案,好在一般的项目,我们在本地事务就可以处理。

希望微软可以在一些重点分布式上多做点研究、普及和推广,提供分布式相关项目的解决方案,别整天操碎心在那些简单的增删改查上。


转载 http://www.cnblogs.com/cyq1162/p/3554510.html

.net用TransactionScope实现事务 代码很简单,(需using System.Transactions;)在需要事务的地方加上下面代码: using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { //操作1 //操作2 // 如果所有的操作都执行成功,则Complete()会被调用来提交事务;否则不会调用并回滚事务 scope.Complete(); } 阅读详情

相关推荐

别再乱用TransactionScope了!C#分布式事务的5个实战避坑指南(附代码)

本文深入探讨C#中TransactionScope在分布式事务中的常见误用场景与性能优化策略,提供跨数据库兼容性解决方案和微服务架构下的替代方案。通过实战代码示例,帮助开发者避免TransactionScope的典型陷阱,提升分布式事务处理效率。

weixin_33709364的博客 385

【C#】简单认识TransactionScope,以及常见的事务类型

这是小5写的博客之星城市领跑,第一篇文章。简单介绍C#常见的事务。

小5聊的博客 5242

DLMS—Cryptographic algorithms—(Green-Book)加密算法

密码学是数学的一个分支,基于数据的转换,并且可以用来提供多种安全服务:保密性、数据完整性、认证、授权和不可否认性。密码学依赖于两个基本组成部分:算法(或密码学方法)和密钥。算法是一个数学函数,而密钥是在转换过程中使用的参数。密码算法和密钥用于对数据应用密码保护(例如,加密数据或生成数字签名),以及移除或检查保护(例如,解密加密的数据或验证数字签名)。密码哈希函数:这类函数不需要密钥(尽管它们可以以使用密钥的模式使用)。哈希函数通常用作算法的一个组成部分,以提供安全服务。见9.2.3.2节。对称密钥算法。

一个bug是bug,多个bug能work 1711

TransactionScope的使用

TransactionScope 是 .NET Framework 和 .NET Core 中的一个类,用于简化事务管理。它提供了一种简单的方式来创建分布式事务和本地事务,以确保一系列操作要么全部成功提交,要么全部回滚,以保持数据的一致性。

世界既不黑也不白,而是一道精致的灰。 1181

【Spring源码三千问】哪些循环依赖问题Spring解决不了?

哪些循环依赖问题Spring解决不了?前言版本约定正文场景一: prototype 类型的循环依赖场景二: constructor 注入的循环依赖场景三:Proxy 类型的 Bean 的循环依赖小结 系列博文: 【老王读Spring IoC-0】Spring IoC 引入 【老王读Spring IoC-1】IoC 之控制反转引入 【老王读Spring IoC-2】IoC 之 BeanDefinition 扫描注册 【老王读Spring IoC-3】Spring bean 的创建过程 【老王读Spring I

老王的专栏 7319

STM32 HAL 硬件IIC驱动BNO085:从移植到姿态解算全流程解析(附源码)

本文详细解析了STM32 HAL库下硬件IIC驱动BNO085 IMU传感器的全流程,包括CubeMX配置、驱动移植、传感器初始化、Q格式数据处理及四元数转欧拉角解算。提供了完整的源码实现和常见问题解决方案,帮助开发者快速掌握高精度姿态测量技术。

palm99的专栏 1050

事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33877092的博客 248

继电保护整定值计算软件_「全套69份」整定值计算与设计方案

【全套69份】整定值计算与设计方案,输电线路、变压器、发电机、电容器、母线保护等下载方式见文末内容预览:10kV高压电机保护原理及整定计算35kV环网运行线路继电保护整定计算方案分析35KV以下继电保护及三段式电流保护整定计算110 kv电网计算机整定计算新方案220kV两相式电铁牵引站供电线路的短路故障计算及其保护整定原则分析220kV周潮线接地距离保护整定计算特殊方案750 kV变压器保护配置...

weixin_30825953的博客 5018

分布式事务

(A、B、C三台服务。对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所以节点故障、网络故障是常态,而且要保证服务可用性达到 99.99999%(N 个 9),即保证P 和 A,舍弃 C。PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当。PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果。

LjH01250的博客 2305

非线性动力学_用MatCont分析非线性动力学方程组(一)

写在前面:笔者打算写两到三篇系列文章介绍MatCont,此为第一篇《用MatCont分析非线性动力学方程组(一)》。MatCont是一个基于Matlab而开发的免费工具包,专门用来做非线性动力学模型分叉、向量场、周期性等分析,符号(连续性)运算和数值(离散性)运算均适用。该工具的开发及研究项目由比利时Ghent大学的Willy Govaerts教授、荷兰Utrecht大学的Yuri Kuznets...

weixin_39700215的博客 2770

威联通改装飞牛fnOS全攻略:从刷机到Docker影视部署

NAS系统是家庭数字存储的核心,x86架构的威联通设备凭借通用引导和驱动支持,成为改装替代系统的理想平台。飞牛fnOS作为基于Debian的国产NAS系统,以简洁UI、内置Docker和影视墙以及硬件转码能力,吸引了大量玩家。通过U盘引导安装、BIOS调整、系统盘SSD部署,可实现系统切换;原机械硬盘可挂载为存储池,配合Docker部署下载、远程访问等容器,影视中心自动削刮海报墙,硬件转码保障4K播放。改装过程需注意引导失败、硬盘识别、核显驱动等问题。这套方案能让老旧威联通焕发新生,兼顾易用性与扩展性。本文

weixin_33585822的博客 774

如何用消息系统避免分布式事务?

前阵子从支付宝转账1万块钱到余额宝,这是日常生活的一件普通小事,但作为互联网研发人员的职业病,我就思考支付宝扣除1万之后,如果系统挂掉怎么办,这时余额宝账户并没有增加1万,数据就会出现不一致状况了。 上述场景在各个类型的系统中都能找到相似影子,比如在电商系统中,当有用户下单后,除了在订单表插入一条记录外,对应商品表的这个商品数量必须减1吧,怎么保证?!在搜索广告系统中,当用户点击某广告...

ainie4139的博客 2082

AOI检测总误判?五大常见问题与实战解决方案

通过对图像质量、检测程序、外界干扰、算法优化以及设备维护和校准的全面把控,企业可以有效降低误判率,提升AOI检测的准确性和可靠性,为工业生产提供更有力的质量保障。表现描述:在AOI检测时,元器件字符因印刷颜色深浅、模糊或受到灰尘干扰等差异,再加上元件库参数未根据实际生产优化,会使系统误将合格元件判定为不合格,严重影响生产效益和产品质量。优化元件库:着重检测关键差异字符,如型号编码等关键信息,剔除不必要字符的检测项,减少干扰,专注于关键识别的准确性。检测时,根据物料信息动态更新检测参数,使系统适应物料变化。

ALeader_AOI的博客 3497

分布式事务处理方式总结

在项目开发中,经常会需要处理分布式事务。例如数据库分库分表之后,原来在一个单库上的操作可能会跨越多个数据库。系统服务化拆分之后,原来的在一个系统上的操作可能会跨越多个系统...

qianshanding0708的博客 5375

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图、天地图)

QGis软件 —— 2、QGis加载在线地图两种方式(谷歌地图)

1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Redis~分布式事务和分布式事务锁

redis快是因为他是基于内存进行操作的,并且使用了大量的kv数据结构和很多特殊的数据类型,还使用了io多路复用避免了阻塞,所以使用多线程就可以避免上下文切换和锁机制和线程的创建和销毁,而且说他是单线程但是其他操作比如持久化,连接管理都是多线程式的,最主要的是由于上述条件,redis的性能瓶颈不在线程上,而是在内存容量和网络带宽上但是还有一个问题, 上面说redis是单线程的, 那么就不会有线程安全问题, 那为什么还有让redis支持事务, 还要 要求他使用redis分布式事务锁。

2401_87252173的博客 1849

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Dubbo 分布式事务

分布式事务是指在多个不同的服务或数据库之间,确保一组操作要么全部成功,要么全部失败的机制。分布式事务的核心挑战在于确保数据的一致性和完整性,尤其是在分布式系统中,数据和操作可能分散在不同的网络节点上。两阶段提交协议(2PC, Two-Phase Commit Protocol):经典的分布式事务管理协议,分为准备阶段(Prepare Phase)和提交阶段(Commit Phase)。XA 是一种基于两阶段提交的分布式事务协议。

Flying_Fish_roe的博客 1788

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

事务、分布式事务原理及实现

事务是由一系列对数据库中数据进行访问与更新的操作所组成的一个程序执行逻辑序列。这些操作要么全都执行,要么全都不执行,是一个不可分割的工作单元。比如我们进行银行转账1万元,要进行两个原子动作:动作一:先从客户A账号扣除1万元;动作二:然后在客户B账号上增加1万元。这两个动作一定要一起完成,不管服务器发生停电,断网还是其它故障。ACID特性。

2301_76231061的博客 1121

Seata分布式事务

首先要分析分布式事务的话,就要明白什么是分布式事务嘛,那么分布式事务就是在微服务中,多个微服务做同一个业务的时候,每个微服务要做到同成功同失败,那么这个就是分布式事务嘛,那通过什么玩意来达到这个目的呢,就是我们今天的主角,Seata!!!!本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则:分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:跨数据源的分布式事务跨服务的分布式事务综合情况在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成。例

weixin_65549694的博客 2945
上一篇: 架构师
下一篇: ffmpeg RTMP
dongdong_java
博客等级 码龄16年 87粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值