我的应用已启用transaction
范围。以下代码已用于激活Scope,它已激活一小时。但是,它已经在10分钟内结束。
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,TimeSpan.FromHours(1)))
{
// my code goes here.
}
奇怪的行为是什么?为什么它不能活到一个小时的生命?
答案 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连接或命令超时,它可能比事务超时短。