Для каждого рефлектора основные правила установки времени транзакции с помощью конструкторов TransactionScope
следующие:
DefaultTimeOut определяется по первому правилу снизу, которое удовлетворяется:
- если конструктор имеет параметр
TimeSpan
, то DefaultTimeout является этим параметром
- , если конструктор имеет параметр
TransactionOption
, значение DefaultTimeout равно transactionOption.TimeOut
- , если в конструкторе есть параметр
TransactionScopeOption
, значение DefaultTimeout равно scopeOption.TimeOut
- если конструктор не имеет параметра времени ожидания, DefaultTimeout - это значение, указанное в файле приложения или веб-конфигурации.
- в противном случае DefaultTimeOut равен 1 минуте.
MaxTimeOut равно 10 минутам, если в файле machine.config не указано другое значение.
Эффективное время ожидания для транзакции меньше значений MaxTimeOut и DefaultTimeOut, больше нуля. Если MaxTimeOut и DefaultTimeOut равны нулю, эффективный тайм-аут представляет собой количество тактов, представленное long.MaxValue
(бесконечность).
Если экземпляр TransactionScope
не создает новую транзакцию либо из-за того, что транзакция передается в ее конструктор, либо из-за того, что параметр области действия транзакции не требует этого (например, когда присутствует окружающая транзакция и TransactionScopeOption требуется) , но параметр timeOut
все еще передается в конструктор, запускается таймер. По истечении времени ожидания вызывается метод TimeOut()
базовой транзакции. Свойства DefaultTimeOut и MaxTimeOut в этом случае не используются.
Если transactionScopeOption == TransactionScopeOption.Supress
, тайм-аут игнорируется и не оказывает влияния.
Также можно определить MaxTimeOut в файле конфигурации приложения / web, если соответствующий раздел в machine.config переопределен (обратите внимание на значения атрибутов allowDefintion и allowExeDefinition):
<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);