Двофазна транзакція

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Проблема

[ред. | ред. код]

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

Вирішення

[ред. | ред. код]

Перевіряти стан кожної транзакцій допоки вони не будуть виконані.

Діаграма, що демонструє взаємодію компонентів у двофазній транзакції

Фаза підготовки

[ред. | ред. код]

На цьому етапі вузол-координатор запитує всіх учасників, чи готові вони здійснити транзакцію. Учасники тоді відповідають так або ні.

  1. Координатор надсилає запит про можливість здійснення транзакції та очікує відповіді від кожного учасника.
  2. Учасники виконують операцію та зупиняються у точці здійснення транзакції.
  3. Учасники надсилають координатору повідомлення про можливість здійснити транзакцію або про помилку.

Фаза фіксації

[ред. | ред. код]

На цьому етапі, якщо всі вузли відповіли про можливість здійснення транзакції, координато попросить їх зафіксуватись, в іншому випадку — скасувати операцію.

Успішне виконання

[ред. | ред. код]

Якщо координатор отримав повідомлення від всіх вузлів про можливість здійснення транзакції, відбуваються наступні кроки:

  1. Координатор надсилає запит усім вузлам про здійснення транзакції.
  2. Усі вузли здійснюють транзакцію.
  3. Усі вузли надсилають повідомлення про успішність транзакції.

Невдале виконання

[ред. | ред. код]

Якщо хоч один учасник надіслав повідомлення про неможливість здійснення транзакції (або час очікування координатора сплив):

  1. Координатор надсилає запит на скасування операції.
  2. Усі вузли скасовують свої дії.
  3. Усі вузли надсилають повідомлення про успішність скасування операції.

Недоліки

[ред. | ред. код]
  • Координатор є слабким місцем системи та при його несправності не можливо здійснити транзакції.
  • Даний підхід блокує роботу системи. Кожному вузлу доводиться очікувати повідомлення від решти вузлів.

Див.також

[ред. | ред. код]