Microsoft分布式事务处理协调器(DTC)未遵守超时



下面显示了一种测试方法,该方法负责在windows服务器启动期间测试不同的SQL Server实例数据库组合以获得DTC支持。

然而,我们希望每对数据库的测试在(~15s(的短时间内失败或通过。假设除此之外,它无论如何都会失败99%。

问题是,即使为2个EF上下文的CommandTimeout和事务本身指定了短超时,代码仍会在下面显示的行上暂停2分钟。

测试两个数据库db1、db2:的DTC兼容性的C#代码

bool TestDbPair(SomeDb db1, SomeDb db2)
{
try
{
int timeoutSeconds = 15;
TransactionOptions xactOpts = new TransactionOptions();
xactOpts.IsolationLevel = IsolationLevel.ReadCommitted;
xactOpts.Timeout = new TimeSpan(0, 0, timeoutSeconds + 3);    // +fudge since it should wraps CommandTimeout below
using (TransactionScope dbTransaction = new TransactionScope(TransactionScopeOption.Required, xactOpts))
using (CommonContext cmnCtx1 = db1.NewCommonContext())
using (CommonContext cmnCtx2 = db2.NewCommonContext())
{
cmnCtx1.Database.CommandTimeout = timeoutSeconds;
cmnCtx2.Database.CommandTimeout = timeoutSeconds;
Environment env = new Environment
{
PropertyName = _propertyName,
StringValue = "Test",
CreatedBy = "ServerTest",
CreatedUtc = DateTime.UtcNow,
ModifiedBy = "ServerTest",
ModifiedUtc = DateTime.UtcNow,
Comments = "test",
};
cmnCtx1.Environment.Add(env);
cmnCtx2.Environment.Add(env);
cmnCtx1.SaveChanges();
cmnCtx2.SaveChanges();    // <<<--- hangs here for ~2 minutes
dbTransaction.Complete();
return true;
}
}
catch (Exception)
{        
return false;
}
}

下面发布的错误似乎与";ConnectionTimeout";未设置的每个数据库的属性(由于调试时connected标志为true,因此它已连接到数据库(。是否存在可在某处指定的DTC的连接超时?

COMException:MSDTC事务管理器无法提取由于通信而来自源事务管理器的事务问题。可能的原因是:存在防火墙,但没有有MSDTC进程的异常,两台计算机找不到通过各自的NetBIOS名称或对网络的支持未为两个事务管理器中的一个启用事务。(HRESULT异常:0x8004D02B(

这篇文章的重点是解决超时错误,而不是DTC错误,因为代码的目的是测试故障诊断码,故障是有效的结果,这些故障诊断码问题有无数自己的故障排除步骤。

您正在设置的事务超时告诉事务管理器,事务本身不应长于设置的超时。只有当两个数据库都向事务管理器报告结果时,事务超时才会起作用。您得到的异常显示事务管理器无法与其中一个数据库对话,这是一个完全不同的问题
这更像是网络问题,其他超时正在进行。

最新更新