我有一个场景,我必须将数据插入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();
}
答案 0 :(得分:1)
除了编写存储过程以完成工作之外,没有其他方法可以让您的代码在没有MSDTC的情况下执行此操作。 MSDTC负责跨不同来源(即两个数据库)进行代理交易。
您的DBA可能不允许您进行更改,因为它是服务器级别的更改,但他们可能会自行打开该功能。请注意,如果它是开发服务器,您最终必须对项目必须运行的任何其他服务器执行相同的操作。
MSDTC是Microsoft分布式事务处理协调器的首字母缩写。顾名思义,MSDTC是一种Windows服务,为分布式系统提供事务基础架构。在这种情况下,事务意味着构造分布式系统中自治代理之间的交互的一般方式。每个事务都是一个具有四个关键属性的状态转换 - ACID属性:Atomic(全部或全部),Consistent(合法),Isolated(独立于并发事务)和Durable(一旦发生,它就不能被废除)。有不同的技术可以实现ACID属性,但最常见的是两阶段提交。