首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务作用域超时10分钟

事务作用域超时10分钟
EN

Stack Overflow用户
提问于 2012-08-21 21:05:22
回答 8查看 72.9K关注 0票数 37

我在C#中有一个长期运行的TransactionScope。我告诉作用域它应该有一个很长的时间跨度,但我仍然得到一个超时。是什么导致了这种情况?

代码语言:javascript
复制
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{ 
    DoLongCode();
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-08-21 21:10:54

您好,您可以在配置文件中验证maxTimeout,如果您的web.config或app.config上没有此部分

验证您的machine.config

代码语言:javascript
复制
<configuration> 
  <system.transactions>
    <machineSettings maxTimeout=""/>
  </system.transactions>
</configuration> 

调整值

票数 26
EN

Stack Overflow用户

发布于 2015-03-04 07:45:57

要允许事务花费10分钟以上,而不需要更改machine.config,请使用以下代码

代码语言:javascript
复制
    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);
    }

用法:

代码语言:javascript
复制
using (var ts = CreateTransactionScope(TimeSpan.FromMinutes(20)))
{ 
    DoLongCode();
    ts.Complete();
}

Based on this article文章的代码最初粘贴在这里。答案中的代码现在进行了重构和简化。

票数 40
EN

Stack Overflow用户

发布于 2012-10-18 03:29:09

进一步澄清:

事务作用域使用计算机配置设置作为最大超时。默认机器超时时间为10分钟。

将机器配置设置为2小时:

代码语言:javascript
复制
      <system.transactions>
        <machineSettings maxTimeout="02:00:00"/>
      </system.transactions> 

app.config或web.config可以减少到超时,但不能超过机器配置超时。

将应用配置设置为1小时:

代码语言:javascript
复制
<system.transactions>
     <defaultSettings timeout="01:00:00" />
</system.transactions>

此外,当达到限制时,我们没有收到任何异常,也没有跟踪或事件日志记录。

此外,TransactionScope对象具有允许指定超时的构造函数重载,但我不确定如何处理。

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12055511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档