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


Эскалация управления транзакциями

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

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

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

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

Как инициируется эскалация

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

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

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

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

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

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

Тип исключения Состояние
InvalidOperationException Попытка эскалации транзакции с уровнем изоляции равным Snapshot.
TransactionAbortedException Диспетчер транзакций отключен.
TransactionException Эскалация терпит неудачу, и приложение завершается.