如下内容来源与:http://www.cyqdata.com/cyq1162/article-detail-54453数据库
本地事务:这个没什么好说了,就是单个事务,每种数据库都有本身的实现,事务的深度内涵能够搜索查看相关的文章,不是本文介绍的重点。架构
分布式事务,须要添加引用System.Transactions,同时启用MSDTC分布式事务服务:一般使用方式为:框架
分布式事务本质上是引入了第三方裁判,来想办法对多个本地事务监控同时成功或同时失败,这里分享几个知识点:分布式
A:若是代码块里,若存在两个或以上数据库连接DbConnection,则须要启动微软的MSDTC分布式事务服务。工具
用命令行启动或中止服务:测试
B:若是代码块里,只有一个数据库连接DbConnection,那么实际上只是本地事务在处理,就算MSDTC分布式事务服务没启动,也不会报错。优化
C:对于TransactionScope包含的代码块,本质是监控了代码块里数据库连接DbConnection的个数,若是有多个不一样的对象,则引入MSDTC当裁判,而实际执行的事务的仍是各个本地事务。ui
D:MSDTC老是不够稳定,我在测试时两个简单的事务一块儿时,按住F5不停刷新,居然能把MSSQL服务也给挂了,而用本地事务就算跨库也不会有问题。编码
因此,不是必须的状况,尽可能不要引入分布式事务,应该避免使用TransactionScope来包含事务块的冲动。 spa
问题:一个代码块里N个实体类杂交操做,每一个实体类带有各类的数据库连接,从而引起了MSDTC。
能够:共用一个DbConnection对象,来避免启用MSDTC。
每种数据库有本身的解决方式:像MSSQL,跨库处理只要加前缀(dbname..tablename)就能够,所以也使的只使用本地事务就能够处理了。
实体类项目,工厂项目,接口项目,数据操做,还有大量的增删改查存储过程,只是为了基础的增删改查并且只针对MSSQL。
随便展开一个项目都会看到大量的文件夹,里面有大量的文件,而这些东东,都是代码生成器的杰做:
19个数据库啊,NN个表,光生成这些基本的增删改查,整个项目就好像高端大气上档次了。
对于生成的大量的实体,每一个表的操做都是一个新的连接,单库间的事务都必须MSDTC了,更别说19个库间的跨库事务了。
为了消灭上述的那些大量的生成文件,我在后续新的公司写了传统的ORM框架:XQData(这个框架一直没露过面,也只是支持MSSQL,用反射消灭了好多层,只留下实体层)。
对于框架的演进,多数都来源于项目中遇到的问题,或复杂的场景,须要解决或者简化,才有了不断升级的可能,并非无中生有,所以,一个框架,若是不能不断在在项目中实战,那么不少问题和细节等可能都没法发现,更新也会遥遥无期。
而CYQ.Data的不断升级,说明我一直在奋战在一线的编码生涯中和网友各大项目中的实战反馈中。
下面针对最近的优化调整,演示下CYQ.Data是怎么解决上面提到的几个问题:
A:先用配置工具生成针对多数据库的枚举文件,和成demo和test两个数据库:
两个数据库就生成两次了。
B:配置一个默认的连接字符串,到Demo数据库:
C:打印操做Test数据库表的连接字符串:
输出:
输出的结果:
若是注释掉代码中的事务,则是直接切换数据库连接,输出会以下图:
对于.NET领域,微软除了提供这个不太稳定的MSDTC,彷佛没有发现其它分布式事务的解决方案,好在通常的项目,咱们在本地事务就能够处理。
但愿微软能够在一些重点分布式上多作点研究、普及和推广,提供大型项目的解决方案,别成天操碎心在那些简单的增删改查上。