【问题标题】:Transaction with multiple DbContext and each one with its own connection on Entity Framework与多个 DbContext 的事务,每个 DbContext 在实体框架上都有自己的连接
【发布时间】:2015-10-05 08:34:46
【问题描述】:

我知道这看起来像是重复的,因为在多个上下文中存在大量关于事务的问题,但没有一个涉及这种情况。

设置

  1. 开发机器上的 SQL Server 2016(最新预览版)或生产机器上的 SQL Azure v12
  2. 实体框架 6.1.3
  3. .Net 4.5 在常规应用程序上
  4. 应用程序可以在 Azure 云服务或 VM 上运行,这并不重要

我们在代码中拥有的东西

  1. 单个 TransactionScope
  2. TransactionScope 之外创建了两个 DbContext(它是由与 ASP.Net MVC 相关联的依赖注入机制创建的,因此为了简化示例,我将其排除在外)
  3. 每个上下文创建并维护自己的连接,该连接指向不同服务器上的不同数据库(如果在开发机器上运行,它也可以指向同一服务器,但仍然是不同的数据库)。
  4. 我们使用常规 SQL 身份验证 - 用户 ID 和密码(以防有人指出一些帖子谈论集成安全和 MSDTC 的问题,我们不在本地使用它,因为在 Azure SQL 上不受支持)

我们的代码示例

当我们做这样的事情时:

var contextA = new ContextA();
var contextB = new ContextB();
using(var scope = new TransactionScope())
{
     var objA = new EntityA();
     objA.Name = "object a";
     contextA.EntitiesA.Add(objA);
     contextA.SaveChanges();

     var objB = new EntityB();
     objB.Name = "object B";
     contextB.EntitiesB.Add(objB);
     contextB.SaveChanges();
     scope.Complete();
}

我们收到什么

System.Data.Entity.Core.EntityException 在调用 contextA.SaveChanges() 时被抛出,并带有以下消息:

根异常底层提供程序在 EnlistTransaction 上失败。

内部异常连接当前已登记事务。完成当前事务并重试。

那么,有人知道这个样本到底出了什么问题吗?

我们正在尝试使用多个上下文和每个上下文都有自己的数据库连接来创建单个事务。显然,由于每个上下文的数据都在不同的数据库服务器上(在生产中),我们不能使用接收 DbConnection 并与两个上下文共享它的 DbContext ctor,因此共享 DbConnection 不是一种选择。

非常感谢,非常感谢您的帮助。

【问题讨论】:

    标签: sql-server entity-framework azure-sql-database transactionscope distributed-transactions


    【解决方案1】:

    Azure SQL 数据库现在支持使用 TransactionScope 的分布式事务。见TransactionScope() in Sql Azure

    【讨论】:

      【解决方案2】:

      AFAIK,SQL Azure 不支持分布式事务。 Source

      【讨论】:

      • 事实上你是对的。不幸的是,Azure 上不支持分布式事务。谢谢
      猜你喜欢
      • 2017-03-09
      • 2018-03-02
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 2012-08-03
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多