我遇到这种情况:
try
{
if (log.QuantidadeTentativa <= 3)
{
using (TransactionScope scope = new TransactionScope())
{
try
{
logIntegracaoRepository.LimpaMovimentoCancela(log.DataInicio, log.DataFim, log.ShoppingId.Value);
ObterDadosDoServicoNeposFull(log, shopping);
movimentoCancelaRepository.GravaMovimentoCancela(log.Id);
scope.Complete();
}
catch (Exception ex)
{
scope.Dispose();
throw ex;
}
}
}
}
catch (Exception ex)
{
throw ex;
}
这里我在transactioncope中有3个步骤。第一个是通过一个过程删除数据库中的行。
第二步是从服务中获取xml数据并将它们插入到几个中间表中,
最后一步是将这些数据从中间表移动到其他数据作为确定数据。
如果我不使用transactionscope,那些步骤可以正常工作。如果我使用它,第二步抛出超时异常。
我几乎一切皆有可能,没有成功。我无法更改machine.config,因为我在客户端服务器上没有这个permition。
我使用了以下这一行也没有成功。在这一行中,我设置了超时时间。最多使用2小时,但错误仍然存在。
int timeToScope = Convert.ToInt32(ConfigurationManager.AppSettings["ScopeTransactionTimeInSeconds"]);
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromSeconds(timeToScope)))
唯一的问题是这个交易镜......我真的不知道该怎么做。
答案 0 :(得分:0)
您的超时可能无法连接到MSDTC。除非您使用相同的数据库连接,否则第二个db往返会将其升级为分布式事务。
分布式事务由MSDTC在数据库服务器上的本地系统上进行管理。如果数据库服务器与运行代码的服务器位于不同的域中,则无法进行身份验证。如果发生了这种情况,您可以在Windows事件日志中看到这一点。
同样,如果MSDTC没有在两台机器上运行,或者防火墙阻止了COM RPC调用等,它也会失败。
如果你想完全避免使用MSDTC,请保持数据库连接,并在transactioncope中为所有数据库操作重用它。
答案 1 :(得分:0)
确保您不使用分布式事务。当您有多个事务数据源(如不同的数据库或同一数据库)时,会发生分布式事务,但您使用不同的连接字符串来访问它们。
如果必须使用分布式事务,请确保启用它们。
分发事务由Windows服务中的“分布式事务处理协调器”服务运行。默认情况下,它已停止并具有手动启动模式。