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


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

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

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

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

отключено

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

Заметка

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

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

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

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

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

обязательный

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

требуется что-то новое

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

Заметка

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

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

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

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

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

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

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.

схема, показывающая взаимодействие клиента с транзакцией 1 и транзакцией 2.

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

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

задание атрибута транзакции