C#Transaction Scope与同一服务器上的2个数据库导致异常

时间:2017-05-02 16:00:08

标签: c# entity-framework transactions

我有一个场景,我必须将数据插入2个数据库,但在同一个数据库服务器上,它必须在一个事务中。我正在使用实体框架6,我将每个数据库保存包装在事务范围内。问题是第一个数据库保存工作正常,但当我尝试第二次保存到另一个数据库时,出现如下错误。

已禁用分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问。

我已经阅读了一些文章,我必须在SQL服务器中启用一个功能,但我不相信我们的DBA会允许这种修改。所以我想首先验证没有其他解决方案代替启用DTC。

这是我现有的C#代码,为简洁起见删除了一些细节。

using (TransactionScope transaction = new TransactionScope())
{
    //database 1
    using (var context1 = new SomeContext())
    {
        //......
        //.....
        context1.SaveChanges();
    }

    //database 2
    using (var context2 = new SomeContext2())
    {
        //...
        context2.SaveChanges();
    }

    transaction.Complete();
}

1 个答案:

答案 0 :(得分:1)

除了编写存储过程以完成工作之外,没有其他方法可以让您的代码在没有MSDTC的情况下执行此操作。 MSDTC负责跨不同来源(即两个数据库)进行代理交易。

您的DBA可能不允许进行更改,因为它是服务器级别的更改,但他们可能会自行打开该功能。请注意,如果它是开发服务器,您最终必须对项目必须运行的任何其他服务器执行相同的操作。

On MSDTC

  

MSDTC是Microsoft分布式事务处理协调器的首字母缩写。顾名思义,MSDTC是一种Windows服务,为分布式系统提供事务基础架构。在这种情况下,事务意味着构造分布式系统中自治代理之间的交互的一般方式。每个事务都是一个具有四个关键属性的状态转换 - ACID属性:Atomic(全部或全部),Consistent(合法),Isolated(独立于并发事务)和Durable(一旦发生,它就不能被废除)。有不同的技术可以实现ACID属性,但最常见的是两阶段提交。