TransactionScope在C#中的奇怪行为

时间:2013-04-02 12:34:14

标签: c# .net transactionscope

我的应用已启用transaction范围。以下代码已用于激活Scope,它已激活一小时。但是,它已经在10分钟内结束。

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,TimeSpan.FromHours(1)))
{
   // my code goes here.
}

奇怪的行为是什么?为什么它不能活到一个小时的生命?

3 个答案:

答案 0 :(得分:4)

您必须在app.config(或web.config)中延长默认交易超时:

<configuration>
 <system.transactions>
  <defaultSettings timeout="00:03:00" />
 </system.transactions>
</configuration>

您还必须在计算机级别更改配置,即您还必须编辑machine.config文件。在机器级别,默认的最大事务超时为10 minutes

例如,我在machine.config文件的末尾添加了以下XML:

  <system.transactions>
    <machineSettings maxTimeout="100.23:59:59" />
  </system.transactions>

machine.config文件位于C:\Windows\Microsoft.NET\Framework\[framework version]\Config目录。

答案 1 :(得分:3)

TransactionScope的默认最大超时时间为10分钟。如果你用更大的超时创建它,无论如何它会默默地减少到10分钟。这是一个非常令人惊讶的行为,但代码确实如此:

public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout)
{
     ...
     timeout = TransactionManager.ValidateTimeout(scopeTimeout);
     ...
}

并且ValidateTimeout将其缩减为TransactionManager.MaximumTimeout

internal static TimeSpan ValidateTimeout(TimeSpan transactionTimeout)
{
    ...
    if (TransactionManager.MaximumTimeout != TimeSpan.Zero && (transactionTimeout > TransactionManager.MaximumTimeout || transactionTimeout == TimeSpan.Zero))
    {
        return TransactionManager.MaximumTimeout;
    }
    return transactionTimeout;
}

答案 2 :(得分:1)

您在交易中的代码中做了什么?通常,其他超时会发挥作用,例如SQL连接或命令超时,它可能比事务超时短。