我的应用程序已启用 transaction
范围。以下代码已用于激活 Scope,已激活一小时。然而,它已经在10分钟内结束。
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,TimeSpan.FromHours(1)))
{
// my code goes here.
}
什么是奇怪的行为?为什么它的寿命不超过一小时?
我的应用程序已启用 transaction
范围。以下代码已用于激活 Scope,已激活一小时。然而,它已经在10分钟内结束。
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,TimeSpan.FromHours(1)))
{
// my code goes here.
}
什么是奇怪的行为?为什么它的寿命不超过一小时?
您必须在您的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
目录中。
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;
}
你在事务内部的代码中做什么?通常,其他超时也会发挥作用,例如 SQL 连接或命令超时,它们可能比事务超时更短。