Saga — патерн проєктування, який дозволяє координувати транзакції здійснені до різних баз даних у вигляді однієї операції.

Проблема

Необхідно виконати декілька транзакцій до різних баз даних у вигляді єдиної операції.

Вирішення

Виконувати транзакції одна за одною, та в разі невдачі хоч однієї скасувати усі попередні.

Опис

Хореографія

Кожний вузол здійснює транзакцію та публікує повідомлення, яке запускає транзакції в інших вузлах.

Вузол № 1 здійснює транзакцію та публікує повідомлення про її успішність. Вузол № 2 отримує повідомлення про завершення операції у вузлі № 1 та здійснює транзакцію. Після чого публікує повідомлення про її успішність. Якщо під час транзакції відбулась помилка, вузол № 1 скасовує транзакцію. Вузол № 3 отримує повідомлення про успішне завершення операції у вузлі № 2 та здійснює транзакцію. Після чого публікує повідомлення про її успішність. Якщо під час транзакції відбулась помилка, вузол № 2 скасовує транзакцію. Вузол № 1 отримує повідомлення про скасування транзакції від вузла № 2 (або про помилку виконання у вузлі № 3) і також скасовує транзакцію.

Оркестрація

Координатор по черзі надсилає запит на здійснення транзакції кожному вузлу. Якщо хоч один вузол відповідає про помилку здійснення транзакції, координатор у зворотному порядку надсилає запити про скасування транзакції усім вузлам.

Недоліки

Складність реалізації компенсаційних транзакцій. Порядок кроків при скасуванні транзакції не завжди дзеркальний початковій операції. Також при скасуванні транзакції варто враховувати, що дані могли бути змінені іншими транзакціями.

Реалізація

C#

Див. також Шаблони проєктування програмного забезпечення