Поделиться через


Передача управления транзакцией на следующий уровень иерархии

В ОС Windows реализован набор служб и модулей, которые составляют диспетчер транзакций. В данном разделе описывается процесс переноса транзакции из одного компонента диспетчера транзакций в другой.

System.Transactions включает компонент диспетчера транзакций, который координирует транзакцию, включающую не более одного устойчивого ресурса или несколько переменных ресурсов. Поскольку диспетчер транзакций использует только вызовы внутри домена приложения, он обеспечивает оптимальную производительность. Разработчикам не требуется взаимодействовать с диспетчером транзакций напрямую. Эту задачу выполняет предоставляемая пространством имен System.Transactions общая инфраструктура, которая определяет интерфейсы, распространенное поведение и вспомогательные классы.

Если вы хотите предоставить транзакцию объекту в другом домене приложения (включая границы процесса и компьютера) на одном компьютере, System.Transactions инфраструктура автоматически передает транзакцию, которой управляет координатор распределенных транзакций Майкрософт (MSDTC). Передача также происходит при зачислении другого диспетчера устойчивых ресурсов. После передачи транзакции на следующий уровень иерархии управление транзакцией осуществляется на этом уровне до ее завершения.

Помимо транзакций System.Transactions и транзакций MSDTC существуют транзакции промежуточного типа, предоставляемые механизмом повышаемого однофазного зачисления (PSPE). PSPE является еще одним важным механизмом в инфраструктуре System.Transactions, предназначенным для оптимизации производительности. Он позволяет удаленному устойчивому ресурсу, расположенному в другом домене приложения, процессе или компьютере, участвовать в транзакции System.Transactions, не вызывая ее повышения до транзакции MSDTC. Дополнительные сведения о PSPE см. в разделе "Перечисление ресурсов в качестве участников транзакции".

Порядок передачи транзакции на следующий уровень иерархии

Передача транзакции на следующий уровень иерархии приводит к снижению производительности, поскольку координатор MSDTC находится в отдельном процессе и при передаче транзакции координатору MSDTC необходима отправка сообщений за границы исходного процесса. Чтобы повысить производительность, следует отложить или избежать эскалации до MSDTC; Таким образом, необходимо знать, как и когда инициируется эскалация.

Пока инфраструктура System.Transactions работает с неустойчивыми ресурсами и по крайней мере с одним устойчивым ресурсом, поддерживающим уведомления об однофазной фиксации, транзакция принадлежит инфраструктуре System.Transactions. Диспетчер транзакций предоставляется только ресурсам, которые находятся в одном с ним домене приложения и для которых не требуется ведение журнала (запись результата транзакции на диск). Передача транзакции на следующий уровень иерархии, в результате которой инфраструктура System.Transactions передает право владения транзакцией координатору MSDTC, выполняется в следующих случаях.

  • В транзакцию зачислен по крайней мере один устойчивый ресурс, не поддерживающий уведомления об однофазной фиксации.

  • В транзакцию зачислено по крайней мере два устойчивых ресурса, поддерживающих уведомления об однофазной фиксации. Например, добавление одного подключения к SQL Server 2005 не приводит к повышению уровня транзакции. Однако всякий раз, когда вы открываете второе подключение к базе данных SQL Server 2005, что приводит к включению базы данных, инфраструктура обнаруживает, System.Transactions что это второй устойчивый ресурс в транзакции, и передает его в транзакцию MSDTC.

  • Инициирован запрос на "маршалирование" транзакции в другой домен приложения или процесс. Например, требуется сериализация объекта транзакции за границей домена приложения. Объект транзакции маршалируется по значению, то есть любая попытка передать ее через границу домена приложения (даже в том же процессе) приводит к сериализации объекта транзакции. Чтобы передать объект транзакции можно вызвать удаленный метод, который принимает в качестве параметра объект Transaction, или предпринять попытку доступа к удаленному компоненту обслуживания транзакций. При этом объект транзакции будет сериализован, что приведет к передаче транзакции на следующий уровень иерархии, как в случае сериализации транзакции за границей домена приложения. Транзакция становится распределенной, и локальный диспетчер транзакций перестает за нее отвечать.

В следующей таблице перечислены все возможные исключения, которые могут возникнуть при передаче транзакции на следующий уровень иерархии.

Тип исключения Condition
InvalidOperationException Попытка повысить транзакцию с уровнем изоляции Snapshot.
TransactionAbortedException Выход диспетчера транзакций из строя.
TransactionException Сбой при передаче транзакции на следующий уровень иерархии и прерывание работы приложения.