我有两个不同数据库的不同实体。 在我的过程中,我想操纵两个数据库,整个过程必须在事务中。 我尝试过TransactionScope。它适用于单个实体。
var entity1 = clsProject.GetEntity1();
var entity2 = clsProject.GetEntity2();
System.Transactions.TransactionScope tranScope = new System.Transactions.TransactionScope();
entity1.Connection.Open();
entity2.Connection.Open();
//Do operations
entity1.SaveChanges(false);
entity2.SaveChanges(false);
tranScope.Complete();
entity1.AcceptAllChanges();
entity2.AcceptAllChanges();
但是,它在这一行引发了一个错误:entity2.Connection.Open(); 错误消息:基础提供程序在打开时失败。 内部异常:合作伙伴事务管理器已禁用其对远程/网络事务的支持。 (HRESULT异常:0x8004D025)
请提出您的想法。
先谢谢,
Naresh Goradara
答案 0 :(得分:3)
如果您的第二个数据库位于另一台服务器上,则需要在两台服务器上启用Distributed Transaction Coordinator,并且TransactionScope将正常工作。
答案 1 :(得分:1)
如前所述,您需要启用分布式事务处理协调器,但您还需要将其配置为允许传入和/或传出连接。
此外:出于测试目的,您可以将其设置为不需要任何身份验证。
所有这些设置都可以在“组件服务”MMC中“分布式事务处理协调器”的“安全”选项卡上找到。
所有这一切都可以在“Eugene S.”提供的链接上找到:Distributed Transaction Coordinator
另外需要注意的一点是:Microsoft有一个名为DTCPing的DTC测试工具。您可以将此工具提取到要参与事务的两台服务器,同时运行每台服务器上的程序,并使用“事务伙伴”名称(这只是另一台计算机的名称)。点击每个服务器上的运行按钮,该工具将为您运行一些测试 - 它也有一些相当不错的错误报告。