Настройка транзакций

Атрибут транзакции — это декларативное свойство, которое автоматически управляет транзакциями для разработчика компонента. Задав этот атрибут, необходимо исключить необходимость использования явных элементов управления транзакцией в компоненте.

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

COM+ предоставляет следующие значения атрибутов транзакций:

Отключен

Как правило, следует задать это значение атрибута, только если вы уверены, что компонент никогда не обращается к диспетчеру ресурсов. При отключении атрибута транзакции COM+ игнорирует требования к транзакциям компонента в определении контекста размещения объекта. В результате объект может предоставить общий доступ к контексту вызывающего объекта (и транзакции). При переносе COM-компонента на COM+необходимо отключить атрибут транзакции для поддержания того же поведения транзакций, что и ненастройанный COM-компонент.

Примечание.

Ненастройанный компонент — это com-компонент , который не был установлен в приложении COM+.

Не поддерживается

При установке этого значения атрибута COM+ гарантирует, что любой объект, созданный из компонента, никогда не участвует в транзакции независимо от состояния транзакции вызывающего объекта. Объявив это значение, вы гарантируете, что объект не голосует в транзакции вызывающего объекта и не может начать транзакцию собственного. Не поддерживается значение по умолчанию для всех компонентов.

Поддерживается

При установке этого значения атрибута COM+ гарантирует, что любой объект, созданный из компонента, участвует в транзакции, если он существует. Это значение объявляется, когда объект будет предоставлять общий доступ к транзакции вызывающего объекта, не требуя собственной транзакции.

Обязательно

При установке этого значения атрибута COM+ гарантирует, что любой объект, созданный из компонента, транзакционный. Когда COM+ активирует объект с параметром "Обязательный", он смотрит на состояние транзакции вызывающего объекта. Если вызывающий объект имеет транзакцию, новый объект включается в текущую транзакцию. В противном случае COM+ начинает транзакцию, делая новый объект корнем транзакции. Это предпочтительный параметр компонента, выполняющего действия ресурсов, так как он помогает обеспечить защиту транзакций для этих действий.

Требуется создать

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

Примечание.

COM+ не поддерживает вложенные транзакции. Когда один транзакционный объект вызывает другой компонент, помеченный как "Требует нового", COM+ создает автономную границу транзакций для только что активированного объекта. Вторая транзакция не может повлиять на первую транзакцию, если первая транзакция явно не отмечает результаты второй транзакции и изменяет свой голос на основе этих результатов.

Зависимости атрибутов транзакций

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

Значение атрибута Новая транзакция Транзакция клиента Корневой каталог транзакций Активация JIT Синхронизация
Выключено
Никогда
Возможно
Никогда
Необязательно
Необязательно
Не поддерживается
Никогда
Никогда
Никогда
Необязательно
Необязательно
Поддерживается
Никогда
Если у клиента есть транзакция
Никогда
Обязательное поле
Обязательно
Обязательное поле
Возможно
Если у клиента есть транзакция
Если у клиента нет транзакции
Обязательное поле
Обязательное поле
RequiresNew
Всегда
Никогда
Всегда
Обязательное поле
Обязательное поле

Границы транзакций

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

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

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

Сопоставление транзакций

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

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

На следующем рисунке показано возможное сопоставление транзакций. На рисунке клиент создает объект 1, для которого требуется транзакция. Так как транзакция не существует, COM+ создает транзакцию 1 и помещает в нее объект 1 в качестве корневого объекта. Объект 1 создает объект 2, который поддерживает транзакции и поэтому помещается в транзакцию 1. Объект 2 создает объект 3, который не поддерживает транзакции и поэтому помещается вне всех транзакций. Объект 2 также создает объект 4, который требует транзакции и поэтому помещается в транзакцию 1. Объект 3 создает объект 5, который поддерживает транзакции. Тем не менее, поскольку объект 5 создается объектом, который не существует в транзакции, он также помещается вне всех транзакций. Объект 4 создает объект 6, который требует новой транзакции, поэтому COM+ создает транзакцию 2 и помещает в него объект 6 в качестве корневого объекта. Объект 6 создает объект 7, который поддерживает транзакции и поэтому помещается в транзакцию 2.

Diagram that shows a client interaction with Transaction 1 and Transaction 2.

На предыдущем рисунке показаны две потенциальные области проблем. Во-первых, большая часть работы разделена между двумя отдельными транзакциями. Если транзакция 1 завершается ошибкой после того, как объект 4 создает объект 6, транзакция 2 не влияет на результат транзакции 1. Если этот результат не предназначен, можно сложить операции обоих транзакций в одну транзакцию, которую можно выполнить, изменив атрибут транзакции объекта 6 на "Обязательный".

На рисунке сопоставления также показано, что объект 3 и объект 5 не являются транзакциями, выполняяся полностью за пределами область транзакций 1 и 2. Если объект 5 обновляет постоянные данные, может потребоваться пересмотреть его состояние, отличное от транзакций. Объект 5 можно поместить в транзакцию, изменив его атрибут транзакции на "Обязательный".

Настройка атрибута транзакции