对于Reflector来说,使用TransactionScope的构造函数设置事务超时的基本规则如下:
DefaultTimeOut 由下面满足的第一条规则确定:
- 如果构造函数有
TimeSpan 参数,DefaultTimeout 就是那个参数
- 如果构造函数有
TransactionOption参数,则DefaultTimeout为transactionOption.TimeOut
- 如果构造函数有
TransactionScopeOption参数,则DefaultTimeout为scopeOption.TimeOut
- 如果构造函数没有超时参数,则 DefaultTimeout 是在应用程序或 Web 配置文件中指定的值。
- 否则,DefaultTimeOut 为 1 分钟。
MaxTimeOut 为 10 分钟,除非在 machine.config 中指定了另一个值。
事务的有效超时小于大于零的 MaxTimeOut 和 DefaultTimeOut。如果 MaxTimeOut 和 DefaultTimeOut 都为零,则有效超时是long.MaxValue 表示的滴答数(无穷大)。
如果TransactionScope 实例没有创建新事务,要么是因为事务被传递到其构造函数中,要么是因为事务范围选项不需要它(例如,当存在环境事务并且需要 TransactionScopeOption 时) ,但是在构造函数中仍然传递了timeOut参数,启动了一个计时器。当超时时间过去时,底层事务的TimeOut() 方法被调用。在这种情况下不使用 DefaultTimeOut 和 MaxTimeOut 属性。
如果是transactionScopeOption == TransactionScopeOption.Supress,超时被忽略,没有任何作用。
如果 machine.config 中的相关部分被覆盖(注意 allowDefintion 和 allowExeDefinition 属性的值),也可以在 app/web 配置文件中定义 MaxTimeOut:
<sectionGroup name="system.transactions" type="System.Transactions.Configuration.TransactionsSectionGroup, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null">
<section name="defaultSettings" type="System.Transactions.Configuration.DefaultSettingsSection, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
<section name="machineSettings" type="System.Transactions.Configuration.MachineSettingsSection, System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" allowDefinition="MachineToApplication" allowExeDefinition="MachineToApplication"/>
</sectionGroup>
为了快速参考,这里是 TransactionScope 构造函数:
public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout, EnterpriseServicesInteropOption interopOption);
public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions, EnterpriseServicesInteropOption interopOption);
public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions);
public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout);
public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout);
public TransactionScope(TransactionScopeOption scopeOption);