TransactionScope下的两个db上下文失败

时间:2014-06-02 10:15:19

标签: c# entity-framework linq-to-entities

我在单个事务中使用两个与实体框架上下文的数据库连接时遇到困难。

我试图在一个事务范围内使用两个db上下文。我得到“MSTDC不可用”。我读到它不是EF问题,它是TDC,不允许两个连接。

这个问题有答案吗?

2 个答案:

答案 0 :(得分:3)

这是因为框架认为您正在尝试将事务跨越多个数据库。这称为distributed transaction

要使用分布式事务,您需要一个事务协调器。在您的情况下,协调器是Microsoft分布式事务处理协调器,它在您的服务器上作为Widows服务运行。您需要确保此服务正在运行:

enter image description here

启动服务应该可以解决您的问题。

两阶段提交

从纯粹的理论角度来看,分布式事务是不可能的 - 也就是说,不同的系统无法以这样的方式协调他们的行为,即他们可以绝对确定他们要么全部提交,要么全部回滚。

然而,使用交易协调员,你会非常接近(并且足够接近'用于任何可能的目的)。当使用分布式事务时,事务中的每一方都将尝试进行所需的更改,并向协调器报告是否一切顺利。如果所有各方都报告成功,协调员将告知所有各方提交。但是,如果一方或多方报告失败,协调员将告知所有各方回滚其更改。这是" Two-phase commit protocol"。

小心

协调员显然需要时间与交易的各方沟通。因此,使用分布式事务可能会妨碍性能。此外,您的交易可能会遇到阻塞和死锁,MSDTC显然会使您的基础架构变得复杂。

因此,在打开分布式事务处理协调器服务并开始执行项目之前,首先应该仔细查看您的体系结构并说服自己确实需要使用多个上下文。

如果确实需要多个上下文,则应调查是否可以阻止将事务升级为分布式事务。

进一步阅读

您可能需要阅读:

*****参见例如:Reasoning About Knowledge

答案 1 :(得分:0)

您应该运行MSDTC(分布式事务处理协调器)系统服务。