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不可用的問題。行吧,就到這裏。 

相關文章
相關標籤/搜索