我在C#中有一个长期运行的TransactionScope。我告诉作用域它应该有一个很长的时间跨度,但我仍然得到一个超时。是什么导致了这种情况?
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
DoLongCode();
}发布于 2012-08-21 21:10:54
您好,您可以在配置文件中验证maxTimeout,如果您的web.config或app.config上没有此部分
验证您的machine.config
<configuration>
<system.transactions>
<machineSettings maxTimeout=""/>
</system.transactions>
</configuration> 调整值
发布于 2015-03-04 07:45:57
要允许事务花费10分钟以上,而不需要更改machine.config,请使用以下代码
private void SetTransactionManagerField(string fieldName, object value)
{
typeof(TransactionManager).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, value);
}
public TransactionScope CreateTransactionScope(TimeSpan timeout)
{
// or for netcore / .net5+ use these names instead:
// s_cachedMaxTimeout
// s_maximumTimeout
SetTransactionManagerField("_cachedMaxTimeout", true);
SetTransactionManagerField("_maximumTimeout", timeout);
return new TransactionScope(TransactionScopeOption.RequiresNew, timeout);
}用法:
using (var ts = CreateTransactionScope(TimeSpan.FromMinutes(20)))
{
DoLongCode();
ts.Complete();
}Based on this article文章的代码最初粘贴在这里。答案中的代码现在进行了重构和简化。
发布于 2012-10-18 03:29:09
进一步澄清:
事务作用域使用计算机配置设置作为最大超时。默认机器超时时间为10分钟。
将机器配置设置为2小时:
<system.transactions>
<machineSettings maxTimeout="02:00:00"/>
</system.transactions> app.config或web.config可以减少到超时,但不能超过机器配置超时。
将应用配置设置为1小时:
<system.transactions>
<defaultSettings timeout="01:00:00" />
</system.transactions>此外,当达到限制时,我们没有收到任何异常,也没有跟踪或事件日志记录。
此外,TransactionScope对象具有允许指定超时的构造函数重载,但我不确定如何处理。
https://stackoverflow.com/questions/12055511
复制相似问题