UnitofWork и ELMA BPM

Что такое Unit of Work  ?

UnitOfWork (Единица работы) — это часть кода которая выполняется в рамках одной транзакции для базы данных, и если возникнет ошибка — действия в базе откатятся.

В ELMA BPM используется такой паттерн но к сожалению нигде не описано как его использовать и когда.

Где UnitOfWork не работает:
  1. В бизнес процессе в скрипте сходу работать не будет (вызываемый скрипт процесса уже находится в выделенном UnitOfWork)

Где использовать UnitOfWork и когда:

  1. Можно использовать в модуле
  2. Можно использовать в процессе (в таком случае нужно вызывать работу в отдельном потоке — об этом расскажу в следующий раз)
  3. Когда вам нужно сохранить данные до конца выполнения вашего кода

Интерфейс в ELMA (для программистов)

Собственно как использовать UnitOfWork?

В примере обновляются данные по клиенту  — метод возвращает указания есть ли смысл сохранять что то в базу данных (unitOfWork имеет атрибут «есть ли изменения» иногда изменения нужно откатить — это только пример, так делать не всегда правильно)

Также стоит обратить внимание на IsolationLevel  — это уровень изоляции транзакции на уровне БД, стоит обратить внимание на

  • ReadCommitted — гарантирует вам неизменность данных до «коммита» вашей транзакции
  • ReadUncommitted — соседние транзакции могут менять данные которыми вы пользуетесь, будьте уверены что никто кроме вас не изменяет данные, чтобы не удивляться данным которые у вас сохранились). Также блокировки будут на измененных данных. (остальные будут ждать)
  • * прежде чем использовать один из других уровней изоляции
    • убедитесь что ваша база данных поддерживает этот уровень изоляции (или он включен)
    • убедитесь что он не навредит вашим данным и не нарушит целостность базы данных

Ньюансы

 

Есть  особенность (возможно это касается ELMA и ее реализации ) — если в unitOfWork не выполнить ни Commit ни Rollback то далее вызвав в другом unitOfWork — Commit — ничего не произойдет,
случайно определили эту особенность — это очень странно потому что по логике unitOfWork — Disposable и когда он «умирает» он не должен влиять на будущие unitOfWork

внизу два примера описывающие эту ситуацию — один рабочий другой нет

https://pastebin.com/hdbVF1BQ

https://pastebin.com/jnvLtnSQ

Итог

Unit Of Work очень полезная фишка и замечательно что она используется в ELMA — помните данный функционал не описан в документации и будьте аккуратны в использовании — тестируйте.

следите за обновлениями — скоро будут новые подробности.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

UnitofWork и ELMA BPM: 1 комментарий

  • 14.08.2018 в 21:52
    Permalink

    Очень полезная статья, жду статью по вызову UnitOfWork в отдельном потоке.

    Ответ

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

%d такие блоггеры, как:

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: