4

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

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

什么是奇怪的行为?为什么它的寿命不超过一小时?

4

3 回答 3

4

您必须在您的app.config(或web.config)中扩展默认事务超时:

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

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

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

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

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

于 2013-04-02T12:41:23.930 回答
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;
}
于 2013-04-02T12:38:01.900 回答
1

你在事务内部的代码中做什么?通常,其他超时也会发挥作用,例如 SQL 连接或命令超时,它们可能比事务超时更短。

于 2013-04-02T12:41:43.050 回答