【问题标题】:Transactionscope timeout max is only 10 minsTransactionscope 超时最大值仅为 10 分钟
【发布时间】:2017-01-27 11:29:44
【问题描述】:

我无法在客户端修改 machine.config

嵌套事务中是否有其他方法可以使它们持续超过 10 分钟?隔离级别或任何其他选项是否有助于解决超时问题。我在DoWork() 内的事务很好,我认为是外部事务超时。

private void DoAllWork()
{
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TransactionManager.MaximumTimeout))
    {
        DoWork();
        scope.Complete();   
    }
}
private void  DoWork()
{
    Foreach(Some long running loop)
    {   
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TransactionManager.MaximumTimeout))
        {
            // Entity Framework queries / modification / Save Changes
            scope.Complete();   
        }
    }
}

【问题讨论】:

    标签: c# entity-framework transactions transactionscope


    【解决方案1】:

    我有同样的问题。您需要在 machine.config 中更改它。这些设置不起作用。但是更改 machine.config 并不好,所以我像这样解决了它。我正在做的是在运行时获取事务管理器对象并更新它的值,它对我有用。

       public TransactionScope CreateTransactionScope(TimeSpan timeout)
        {
            SetTransactionManagerField("_cachedMaxTimeout", true);
            SetTransactionManagerField("_maximumTimeout", timeout);
    
              var transactionScopeOptions = new TransactionOptions
                {
                    IsolationLevel = IsolationLevel.ReadUncommitted,
                    Timeout = timeout
                };
    
            return new TransactionScope(TransactionScopeOption.RequiresNew, transactionScopeOptions);
        }
    
    
          private void SetTransactionManagerField(string fieldName, object value)
        {
            typeof(TransactionManager).GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, value);
        }
    

    我是这样使用它的

              using (var scope = CreateTransactionScope(TimeSpan.FromMinutes(50)))
                {
            // do something 
            scope.Complete();
    
    
            }
            catch (Exception e)
            {
                new Logger().LogException(e);
    
    
            }
    

    【讨论】:

    • 这是要永久保留新值还是在 scope.complete() 之前有效
    • 嗨@mehwish 示例代码是为了向您展示您是否已完成所有数据库内容并希望保留设置 scope.complete 所需的所有内容,除非它不会保存。
    • 它的意思是一切都很好,以便交易可以完成
    • 我的意思是保持超时值。新的超时值是只存在于事务范围内还是写在某个地方。
    • 在事务范围内会存在。如果要保留它,则必须更改 machine.config 并更改事务超时。但这不是一个好习惯
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2022-12-02
    • 2013-06-15
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多