Transaction Subprocess

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

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

Транзакция может иметь три возможных исхода:

  • Транзакция успешна, если она не отменена и не прервана сбоем (hazard). Если транзакционный подпроцесс успешен, он покидается через исходящий поток (потоки) операций. Успешная транзакция может быть компенсирована, если позднее в процессе выбрасывается Compensation Event.

    Примечание: так же, как и «обычные» встроенные подпроцессы, транзакционный подпроцесс может быть компенсирован после успешного завершения с помощью промежуточного выбрасывающего Compensation Event.
  • Транзакция отменяется, если исполнение достигает Cancel End Event. В этом случае все исполнения завершаются и удаляются. Затем единственное оставшееся исполнение устанавливается на Cancel Boundary Event, который запускает компенсацию. После завершения компенсации транзакционный подпроцесс покидается через исходящий поток (потоки) операций Cancel Boundary Event.

  • Транзакция завершается сбоем (hazard), если выбрасывается событие-ошибка, не пойманное в области видимости транзакционного подпроцесса. (Это также относится к случаю, когда ошибка ловится на границе транзакционного подпроцесса.) В этом случае компенсация не выполняется.

Следующая диаграмма иллюстрирует три различных исхода:

business transaction

Транзакционный подпроцесс представляется в XML с помощью элемента transaction:

<transaction id="myTransaction" >
  <!-- ... -->
</transaction>

Важно не путать транзакционный подпроцесс BPMN с техническими (ACID) транзакциями. Транзакционный подпроцесс BPMN — это не способ задать область видимости технических транзакций. Чтобы разобраться в управлении транзакциями в Camunda 7, прочитайте раздел Transactions in Processes из Руководства пользователя.

BPMN-транзакция отличается от технической транзакции следующим образом:

  • В то время как ACID-транзакция обычно кратковременна, BPMN-транзакция может занимать часы, дни или даже месяцы. (Рассмотрите случай, когда одна из активностей, сгруппированных транзакцией, — это User Task; как правило, люди реагируют дольше, чем приложения. Или, в другой ситуации, BPMN-транзакция может ожидать наступления некоторого бизнес-события, например того факта, что определённый заказ выполнен.) Такие операции обычно занимают значительно больше времени, чем обновление записи в базе данных или сохранение сообщения с помощью транзакционной очереди.

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

  • Поскольку BPMN-транзакция охватывает несколько ACID-транзакций, мы теряем ACID-свойства. Рассмотрим приведённый выше пример. Предположим, что операции «забронировать отель» и «списать с кредитной карты» выполняются в отдельных ACID-транзакциях. Предположим также, что активность «забронировать отель» успешна. Теперь у нас промежуточное несогласованное состояние, потому что мы выполнили бронирование отеля, но ещё не списали средства с кредитной карты. В ACID-транзакции мы тоже выполняли бы разные операции последовательно и поэтому тоже имели бы промежуточное несогласованное состояние. Разница здесь в том, что несогласованное состояние видно за пределами области видимости транзакции. Например, если бронирования делаются с помощью внешнего сервиса бронирования, другие стороны, использующие тот же сервис бронирования, могут уже видеть, что отель забронирован. Это означает, что при реализации бизнес-транзакций мы полностью теряем свойство изоляции (положим, мы обычно также ослабляем изоляцию при работе с ACID-транзакциями, чтобы обеспечить более высокий уровень параллелизма, но там у нас есть точечный контроль, и промежуточные несогласованности присутствуют лишь очень короткие промежутки времени).

  • BPMN-бизнес-транзакцию также нельзя откатить в традиционном смысле. Поскольку она охватывает несколько ACID-транзакций, некоторые из этих ACID-транзакций могут быть уже зафиксированы в момент отмены BPMN-транзакции. В этот момент их уже нельзя откатить.

Поскольку BPMN-транзакции по своей природе длительны, с отсутствием изоляции и механизма отката приходится справляться иначе. На практике обычно нет лучшего решения, чем решать эти проблемы предметно-ориентированным образом:

  • Откат выполняется с помощью компенсации. Если в области видимости транзакции выбрасывается событие отмены, эффекты всех успешно выполненных активностей, имеющих обработчик компенсации, компенсируются.

  • С отсутствием изоляции также часто справляются с помощью предметно-ориентированных решений. Например, в приведённом выше примере номер отеля может казаться забронированным для второго клиента ещё до того, как мы фактически убедились, что первый клиент способен за него заплатить. Поскольку с точки зрения бизнеса это может быть нежелательно, сервис бронирования мог бы выбрать допущение определённого объёма овербукинга.

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

Подведём итог: в то время как ACID-транзакции предлагают универсальное решение таких проблем (откат, уровни изоляции и эвристические исходы), при реализации бизнес-транзакций нам нужно находить для этих проблем предметно-ориентированные решения.

Спецификация BPMN требует, чтобы движок процессов реагировал на события, выдаваемые нижележащим транзакционным протоколом, и, в случае отмены транзакции, если в нижележащем протоколе возникает событие отмены. Будучи встраиваемым движком, движок OpenBPM в настоящее время этого не поддерживает. (О некоторых последствиях этого см. абзац о согласованности ниже.)

Согласованность поверх ACID-транзакций и оптимистичного параллелизма: BPMN-транзакция гарантирует согласованность в том смысле, что либо все активности отрабатывают успешно, либо, если какую-то активность выполнить не удаётся, эффекты всех остальных успешных активностей компенсируются. Так что в любом случае мы оказываемся в согласованном состоянии. Однако важно понимать, что в Camunda 7 модель согласованности для BPMN-транзакций накладывается поверх модели согласованности для исполнения процессов. Движок OpenBPM исполняет процессы транзакционным образом. Параллелизм решается с помощью оптимистичной блокировки. В движке события BPMN error, cancel и compensation построены поверх тех же ACID-транзакций и оптимистичной блокировки. Например, Cancel End Event может запустить компенсацию только если он фактически достигнут. Он не достигается, если до этого Service Task выбрасывает некоторое необъявленное исключение. Эффекты обработчика компенсации не могут быть зафиксированы, если какой-то другой участник нижележащей ACID-транзакции переводит транзакцию в состояние rollback-only. Кроме того, когда два параллельных исполнения достигают Cancel End Event, компенсация может быть запущена дважды и завершиться с исключением оптимистичной блокировки. Всё это говорит о том, что при реализации BPMN-транзакций в ядре движка применяется тот же набор правил, что и при реализации «обычных» процессов и подпроцессов. Поэтому, чтобы эффективно гарантировать согласованность, важно реализовывать процессы с учётом оптимистичной транзакционной модели исполнения. Дополнительную информацию см. в документации по оптимистичной блокировке.

Расширения Camunda

Атрибуты

Элементы расширения

Ограничения

Атрибут camunda:exclusive учитывается только если атрибут camunda:asyncBefore или camunda:asyncAfter установлен в true

Дополнительные ресурсы

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org