Ответ
Two-Phase Commit (2PC) — это протокол распределённых транзакций, обеспечивающий атомарность в системах с несколькими участниками.
Фазы:
- Prepare Phase: Координатор запрашивает у всех участников готовность к фиксации. Участники отвечают "готов" или "отказ".
- Commit/Rollback Phase: Если все участники готовы, координатор отправляет команду "commit". Если хотя бы один отказал — "rollback".
Пример на псевдокоде:
// Координатор
func twoPhaseCommit() {
prepared := askAllParticipants() // Фаза 1
if all(prepared) {
sendCommit() // Фаза 2 (commit)
} else {
sendRollback() // Фаза 2 (rollback)
}
}
Проблемы:
- Блокировка при отказе координатора.
- Не подходит для высоконагруженных систем из-за синхронного ожидания.
Альтернативы: 3PC, Saga.