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

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

不过我碰到的“MSDTC不可用”的问题实在是无法解决。所以只能是记录一下我遇到的问题,和一些过程。

上次我们知道平时一般的操作,都是会默认被事务包裹,当我们调用一次SaveChanges方法就会开启一个事务。

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

BeginTransaction()能够让我们像ADO中使用事务的那种方式使用。而且调用多个savechanges方式只会开启一个事务,但是必须要调用一次SaveChanges才能成功操作数据。

UseTransaction方法允许上下文加入已经运行的事务中,它可以接受一个事务对象。

那么如果我们的数据存在多个数据库中呢?就有了分布式的考虑。怎么做呢?

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

那么我们ado和EF混着用?这个应该是可以的,但是我没有去试。

那么现在就直接来说一个很重要的类:TransactionScop

可以看到这种方式正是我们想要的,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

相关文章: