Атрибуты транзакции ServiceModel
Windows Communication Foundation (WCF) предоставляет свойства в трех стандартных атрибутах System.ServiceModel, которые позволяют настроить поведение транзакций для службы WCF:
TransactionFlowAttribute
Атрибут TransactionFlowAttribute указывает готовность операции в контракте службы к приему входящих транзакций от клиента. Атрибут снабжает данный элемент управления следующим свойством: в транзакциях используется перечисление TransactionFlowOption для указания того, является входящая транзакция Mandatory, Allowed или NotAllowed.
Это единственный атрибут, связывающий операции службы с внешним взаимодействием с клиентом. Атрибуты, описанные в следующих разделах, связаны с использованием транзакций в рамках выполнения операции.
ServiceBehaviorAttribute
Атрибут ServiceBehaviorAttribute задает поведение внутреннего выполнения реализации контракта службы. Из свойств этого атрибута к транзакциям относятся следующие.
TransactionAutoCompleteOnSessionClose указывает, завершать ли незавершенную транзакцию при закрытии сеанса. Значение этого свойства по умолчанию — false. Если это свойство имеет значение true и входящий сеанс был закрыт корректно, а не по причине ошибок сети или клиента, любая незавершенная транзакция успешно завершается. В противном случае, если свойство имеет значение false или если сеанс был закрыт некорректно, любая незавершенная транзакция при закрытии сеанса откатывается. Если свойство имеет значение true, входящий канал должен быть основан на сеансах.
ReleaseServiceInstanceOnTransactionComplete указывает, освобождать ли базовый экземпляр службы при завершении транзакции. Значение этого свойства по умолчанию — true. При поступлении следующего входящего сообщения создается новый базовый экземпляр, и любое записанное в предыдущий экземпляр связанное с транзакцией состояние сбрасывается. Освобождение экземпляра службы — это внутреннее предпринимаемое службой действие, которое не затрагивает никакие существующие подключения или сеансы, установленные клиентами. Эта функциональность эквивалентна JIT-активации, обеспечиваемой COM+. Если свойство имеет значение true, свойство ConcurrencyMode должно быть равно Single. В противном случае при запуске служба вызывает исключение проверки "недопустимая конфигурация".
TransactionIsolationLevel задает уровень изоляции, используемый для транзакций в рамках службы; это свойство принимает одно из значений перечисления IsolationLevel. Если локальное свойство уровня изоляции имеет значение, отличное от Unspecified, уровень изоляции входящей транзакции должен соответствовать значению этого локального свойства. В противном случае входящая транзакция отклоняется, и клиенту отправляется ошибка. Если свойство TransactionScopeRequired имеет значение true и нет поточных транзакций, это свойство определяет значение перечисления IsolationLevel, которое будет использоваться для локально созданной транзакции. Если IsolationLevel имеет значение Unspecified, используется значение Serializable перечисления IsolationLevel.
TransactionTimeout задает период времени, в течение которого созданная в службе новая транзакция должна быть завершена. Если по истечении этого времени транзакция не завершена, она будет прервана. Структура TimeSpan используется в качестве времени ожидания TransactionScope для любых операций, у которых свойству TransactionScopeRequired присвоено значение true и для которых была создана новая транзакция. Время ожидания — это максимально допустимый промежуток от создания транзакции до завершения фазы 1 в протоколе двухфазной фиксации. В качестве времени ожидания всегда используется меньшее из значений свойства TransactionTimeout и параметра конфигурации transactionTimeout.
OperationBehaviorAttribute
Атрибут OperationBehaviorAttribute задает расширения функциональности методов в реализации службы. Его можно использовать для задания конкретного поведения выполнения операции. Свойства этого атрибута не влияют на описание контракта службы на языке WSDL и представляют собой исключительно элементы модели программирования WCF, обеспечивающие стандартные функции, которые разработчикам в противном случае пришлось бы реализовывать самостоятельно.
Этот атрибут имеет следующие относящиеся к транзакциям свойства.
TransactionScopeRequired указывает, должен ли метод выполняться в области активной транзакции. Значение по умолчанию — false. Если для метода не задан атрибут OperationBehaviorAttribute, это также подразумевает, что метод не будет выполняться в транзакции. Если для операции не требуется область транзакции, любая транзакция, присутствующая в заголовке сообщения, не активируется и остается элементом свойства IncomingMessageProperties класса OperationContext. Если для операции требуется область транзакции, источник транзакции определяется одним из следующих способов.
Если транзакция передается в потоке от клиента, метод выполняется в области транзакции, созданной с использованием этой распределенной транзакции.
При транспорте по принципу очереди используется транзакция, которая использовалась для удаления сообщения из очереди. Обратите внимание, что используемая транзакция не является поточной транзакцией, т. е. она не была предоставлена исходным отправителем сообщения.
Пользовательский транспорт может предоставить транзакцию посредством использования свойства TransportTransactionProperty.
Если внешний источник транзакции не задается ничем из перечисленного, непосредственно перед вызовом метода создается новый экземпляр Transaction.
TransactionAutoComplete указывает, следует ли автоматически завершать транзакцию, в которой выполняется метод, при отсутствии необработанных исключений. Если это свойство имеет значение true, вызывающая инфраструктура автоматически помечает транзакцию как завершенную, если пользовательский метод возвращается без вызова исключения. Если свойство имеет значение false, транзакция присоединяется к экземпляру и помечается как завершенная, только если клиент вызывает следующий метод, у которого это свойство равно true, или если следующий метод явно вызывает метод SetTransactionComplete. Если ни одно из этих условий не выполняется, транзакция не будет считаться завершенной, и содержащиеся в ней данные не будут зафиксированы, за исключением случая, когда свойству TransactionAutoCompleteOnSessionClose присвоено значение true. Если этому свойству присвоено значение true, в сеансе необходимо использовать канал, и свойству InstanceContextMode должно быть присвоено значение PerSession.