C# 中 TransactionScope 的奇怪行为

Sma*_*aug 5 .net c# transactionscope

我的应用程序已启用 transaction范围。以下代码已用于激活范围,已激活一小时。然而,10分钟后就结束了。

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

什么是奇怪的行为?为什么它的寿命不能达到一小时?

ken*_*n2k 5

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

<configuration>
 <system.transactions>
  <defaultSettings timeout="00:03:00" />
 </system.transactions>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

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

  <system.transactions>
    <machineSettings maxTimeout="100.23:59:59" />
  </system.transactions>
Run Code Online (Sandbox Code Playgroud)

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


ale*_*lex 4

TransactionScope 的默认最大超时时间为 10 分钟。如果您使用更大的超时来创建它,它无论如何都会默默地将其减少到 10 分钟。这是一个相当令人惊讶的行为,但代码正是这样做的:

public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout)
{
     ...
     timeout = TransactionManager.ValidateTimeout(scopeTimeout);
     ...
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 它将减少到 TransactionManager.MaximumTimeout ,默认情况下为 10 分钟。@ken2k 给出了如何增加它的答案。 (2认同)