我在使用 TransactionScope 时遇到问题,其中初始化了两个 Entity Framework ObjectContexts,一个用于数据库 X,一个用于同一服务器上的数据库 Y。
第一个上下文“cersCtx”创建了一个新的“Contact”对象。第二个上下文“coreCtx”试图找到一个帐户。
在第二个上下文中调用以查找帐户
account = coreCtx.Accounts.SingleOrDefault(p => p.Email == email && !p.Voided);
我收到以下错误:
由于通信问题,MSDTC 事务管理器无法从源事务管理器中提取事务。可能的原因是:存在防火墙并且它对 MSDTC 进程没有异常,两台机器无法通过它们的 NetBIOS 名称找到彼此,或者两个事务管理器之一未启用对网络事务的支持。(来自 HRESULT 的异常:0x8004D02B)
奇怪的是,当我进入 MSDTC 时,我看到有已提交的事务,但大多数情况下它们正在中止。
有人对我如何解决这个问题有任何想法吗?
这是产生此问题的代码的缩写示例。
public void CreateContact(string email)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
using (CERSEntities cersCtx = new CERSEntities())
{
Contact contact = new Contact();
contact.Email = email;
cersCtx.Contacts.AddObject(contact);
cersCtx.SaveChanges();
}
CoreModel.Account account = null;
using (CoreModel.CoreEntities coreCtx = new CoreModel.CoreEntities())
{
account = coreCtx.Accounts.SingleOrDefault(p => p.Email == email && !p.Voided);
}
scope.Complete();
}
}