Оптимизация с помощью однофазного подтверждения и уведомления о повышаемой однофазной транзакции

В этом разделе описываются механизмы, предоставляемые инфраструктурой System.Transactions для оптимизации производительности.

Зачисление на один этап повышаемых

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

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

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

Этот конкретный диспетчер ресурсов обычно имеет собственные внутренние не распределенные транзакции, и он должен поддерживать преобразование этих транзакций в распределенные транзакции во время выполнения. Например, SQL Server 2005 — это диспетчер ресурсов. В таком случае инфраструктура System.Transactions занимает пассивную управленческую позицию, просто отслеживая транзакцию в случае необходимости эскалации. Чтобы обеспечить взаимодействие между инфраструктурой System.Transactions и диспетчером ресурсов, последний должен реализовать интерфейс IPromotableSinglePhaseNotification.

Метод EnlistPromotableSinglePhase используется для регистрации одного устойчивого ресурса, который можно позднее повысить в уровне. Этот метод обеспечивает возможность эскалирования запроса при необходимости. Если регистрация выполнена успешно, RM создает свою внутреннюю транзакцию и связывает ее с System.Transactions транзакцией. Если перечисление PSPE завершается ошибкой, RM следует вместо этого использовать метод EnlistDurable. Сбои при участии в PSPE могут произойти, если транзакция уже является распределенной или другой менеджер ресурсов уже выполнил участие в PSPE.

После зачисления вызовы от клиентов для подтверждения или отмены System.Transactions транзакции преобразуются в вызовы диспетчеру ресурсов через вызов функции SinglePhaseCommit или Rollback соответственно.

System.Transactions Если транзакция никогда не требует эскалации, при фиксации транзакции RM получает SinglePhaseCommit уведомление. Затем он может зафиксировать внутреннюю транзакцию, созданную изначально.

System.Transactions Если транзакция должна быть эскалирована (например, для поддержки нескольких RM), System.Transactions сообщает диспетчеру ресурсов, вызывая метод Promote на интерфейсе ITransactionPromoter, от которого наследуется интерфейс IPromotableSinglePhaseNotification. Затем диспетчер ресурсов преобразует транзакцию внутри локальной транзакции (которая не требует ведения журнала) в объект транзакции, способный участвовать в транзакции DTC, и связывает его с уже выполненной работой. Когда транзакции требуется фиксация, диспетчер транзакций по-прежнему отправляет уведомление диспетчеру ресурсов, который фиксирует SinglePhaseCommit распределенную транзакцию, созданную во время эскалации.

Замечание

Трассировки TransactionCommitted (создаваемые при вызове фиксации на эскалированной транзакции) содержат идентификатор активности транзакции DTC.

Дополнительные сведения об эскалации управления см. в разделе "Эскалация управления транзакциями".

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

В следующем сценарии демонстрируется эскалация распределенной транзакции с помощью пространства имен System.Data в качестве прокси для менеджера ресурсов. В этом сценарии предполагается, что уже существует одно System.Data подключение к базе данных, CN1, вовлеченной в транзакцию, и приложение хочет включить другое System.Data подключение, CN2. Транзакция должна быть передана в DTC в виде полной распределенной двухфазной транзакции фиксации.

В этом сценарии

  1. CN1 вызывает метод EnlistPromotableSinglePhase для добавления в транзакцию. Затем транзакция по-прежнему является локальной, и в транзакции нет других продвигаемых участников, поэтому вызов EnlistPromotableSinglePhase завершается успешно.

  2. При втором подключении CN2 вызов EnlistPromotableSinglePhase терпит неудачу, так как задействовано другое поддающееся продвижению зачисление. Из-за этого CN2 должен получить транзакцию DTC, чтобы передать ее в SQL. Для этого используется один из методов, предоставляемых TransactionInterop классом, для создания формата транзакции, которую можно предоставить SQL.

  3. System.Transactions вызывает метод Promote интерфейса, реализованного CN1.

  4. На этом этапе CN1 эскалирует транзакцию, с использованием механизма, специфичного для SQL 2005 и System.Data.

  5. Возвращаемое значение из Promote метода — это массив байтов, содержащий маркер распространения для транзакции. System.Transactions использует этот маркер распространения для создания транзакции DTC, которую она может включить в локальную транзакцию.

  6. На этом этапе CN2 может использовать данные, полученные вызовом одного из методов, обозначенных как TransactionInterop, чтобы передать транзакцию в SQL.

  7. Теперь оба входят в распределенную транзакцию DTC.

Оптимизация однофазной фиксации

Протокол однофазной фиксации эффективнее во время выполнения, так как все обновления выполняются без явной координации. Чтобы воспользоваться этой оптимизацией, следует реализовать диспетчер ресурсов с помощью интерфейса ISinglePhaseNotification для ресурса и вписаться в транзакцию, используя метод EnlistDurable или EnlistVolatile. В частности, параметр EnlistmentOptions должен быть равен None, чтобы обеспечить выполнение однофазной фиксации.

ISinglePhaseNotification Так как интерфейс является производным от IEnlistmentNotification интерфейса, если RM не имеет права на однофазную фиксацию, он по-прежнему может получать уведомления о фиксации двух этапов. Если RM получает SinglePhaseCommit уведомление от TM, он должен попытаться выполнить необходимую работу, чтобы зафиксировать транзакцию и соответствующим образом сообщить диспетчеру транзакций, если транзакция будет зафиксирована или откатена, вызвав метод Committed, Aborted или InDoubt в параметре SinglePhaseEnlistment. Ответ на перечисление Done на этом этапе подразумевает семантику ReadOnly. Поэтому не следует отвечать с помощью Done в дополнение к другим методам.

Если есть только одно нестабильное участие и нет устойчивого участия, то нестабильное участие получает уведомление SPC. Если есть какие-либо нестабильные зачисления и только одно устойчивое зачисление, нестабильные зачисления получают 2PC. Когда это будет завершено, стабильно зачисленные получает SPC.

См. также