EF6学习笔记二十五:分布式事务

要专业系统地学习EF推荐《你必须掌握的Entity Framework 6.x与Core 2.0》。这本书做者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/

如今来到分布式事务。在弄这个以前我对分布式一点经验也没有。简单来讲一下分布式,就是你有多个数据库。数据库

不过我碰到的“MSDTC不可用”的问题实在是没法解决。因此只能是记录一下我遇到的问题,和一些过程。服务器

上次咱们知道平时通常的操做,都是会默认被事务包裹,当咱们调用一次SaveChanges方法就会开启一个事务。分布式

而后了解到EF中提供的BeginTransaction()和UseTransaction()两个方法。ide

BeginTransaction()可以让咱们像ADO中使用事务的那种方式使用。并且调用多个savechanges方式只会开启一个事务,可是必需要调用一次SaveChanges才能成功操做数据。学习

UseTransaction方法容许上下文加入已经运行的事务中,它能够接受一个事务对象。ui

那么若是咱们的数据存在多个数据库中呢?就有了分布式的考虑。怎么作呢?spa

你可能想到能够经过嵌套上下文,使用UseTransaction来接受另外一个上下文的事务。可是不能够。由于UseTransaction接受的事务对象不是EF中定义的事务,而是System.Data.Common.DbTransaction类型的,也就是ADO中的事务类型code

那么咱们ado和EF混着用?这个应该是能够的,可是我没有去试。对象

那么如今就直接来讲一个很重要的类:TransactionScopblog

能够看到这种方式正是咱们想要的,DB1_Context 和 DB4_Context 分别对应两个数据库,一个本地,还有一个是我远程服务器上的数据库。 经过TransactionScop就能够实现分布式事务。

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { var db1_ctx = new DB1_Context(); var db4_ctx = new DB4_Context(); try { db1_ctx.Students.Add(new Student { Name = "小懵", Score = 11 }); db1_ctx.SaveChanges(); db4_ctx.Books.Add(new Book { Name="西游记",PageSize=670}); db4_ctx.SaveChanges(); scope.Complete(); } catch (Exception e) { throw e; } finally { db1_ctx.Dispose(); db4_ctx.Dispose(); } }
View Code

看一下我项目的文件结构

这里我要记录一下使用程序包管理控制台作数据迁移,将不一样的上下文分别建立不一样的文件夹

好比我为DB1_Context上下文开启迁移

enable-migrations -ContextTypeName:_20190131.DbContexts.DB1_Context -MigrationsDirectory:Migrations\DB1

ContextTypeName就是上下文的类型名称,MigrationsDirectory就是你将要建立的文件夹

若是说你记不住命令,能够写了“-”后按Tab键就会出现提示。若是说没有提示,那么就是你前面的语句写错了。命令不一样区分大小写,可是你本身提供的值仍是要区分的,毕竟DBContext和dbcontext在VS中仍是两个不一样的两个类

命令后面的冒号可写可不写,好比:ContextTypeName:DBcontext  或者 ContextTypeName DBcontext  我仍是以为写上问号好一点,可读性高。

那么添加迁移文件

add-migration -ConfigurationTypeName:_20190131.Migrations.DB1.Configuration -Name:db1001

更新到数据库

update-database -ConfigurationTypeName:_20190131.Migrations.DB1.Configuration -verbose

如今来记录一下我碰到的问题,我也不知道会这么麻烦,对我来讲不过是多了一个数据库而已。

首先我经过EF在MSSQL上的一个实例建立了两个数据库DB1和DB2,因而我执行上面的代码,发现报错了,他说MSDTC不可用。

那么MSDTC是什么?协调跨多个数据库、消息队列、文件系统等资源管理器的事务。若是中止此服务,这些事务将会失败。若是禁用此服务,显式依赖此服务的其余服务将没法启动。

 

反正涉及到分布式就须要配置MSDC,网上有不少图文并茂的配置,但都是同样的。难道都不同么?难道怎么配置都行么?呵呵

最终我没有解决这个问题。

而后我想到是否是由于两个数据库都是在本地,都是在同一个实例中形成的。因而我今天又在个人服务器上安装了一个MSSQL2017,费了

老半天劲终于我本地数据库可以链接远程服务器的数据库实例了。

可是仍是出席那MSDTC不可用的问题。行吧,就到这里。 

相关文章
相关标签/搜索