Проверяет понимание распределённых транзакций и протокола двухфазной фиксации для обеспечения атомарности.
Two-Phase Commit (2PC) — это распределённый алгоритм, который гарантирует атомарность транзакции, затрагивающей несколько независимых узлов или баз данных. В обычной одиночной базе данных транзакция либо полностью выполняется, либо полностью откатывается. В распределённой системе, где данные хранятся на разных серверах, добиться такого же поведения сложнее, потому что каждый узел может выйти из строя или ответить с задержкой. 2PC решает эту проблему, вводя роль координатора и двухфазный процесс согласования.
Протокол делится на две фазы: фазу подготовки (prepare) и фазу фиксации (commit). В фазе подготовки координатор отправляет каждому участнику запрос «подготовиться к фиксации». Участник выполняет все операции транзакции, записывает журнал (undo/redo) и отвечает «готов» (yes) или «не готов» (no). Если хотя бы один участник ответил «не готов» или не ответил в течение таймаута, координатор решает откатить транзакцию. В фазе фиксации координатор отправляет команду «фиксировать» всем участникам, если все ответили «готов». Каждый участник применяет изменения и подтверждает. Если координатор решил откатить, он отправляет команду «откатить».
// Псевдокод координатора
function twoPhaseCommit(participants) {
// Фаза 1: подготовка
for (let p of participants) {
p.prepare();
}
// Проверяем ответы
let allReady = participants.every(p => p.status === 'ready');
// Фаза 2: фиксация или откат
if (allReady) {
participants.forEach(p => p.commit());
} else {
participants.forEach(p => p.rollback());
}
}2PC используется в системах, где требуется строгая согласованность между несколькими базами данных, например, в банковских системах при переводе средств между счетами в разных банках, в микросервисной архитектуре при необходимости атомарного обновления нескольких сервисов, а также в распределённых базах данных (например, в некоторых реализациях PostgreSQL с расширением для распределённых транзакций). Однако 2PC имеет недостатки: блокирует ресурсы на время транзакции, чувствителен к сбоям координатора и не масштабируется хорошо для большого числа участников.
Two-Phase Commit — это классический протокол для обеспечения атомарности в распределённых системах, когда важна строгая согласованность. Его стоит применять в сценариях с небольшим числом участников и высокими требованиями к надёжности, но для высоконагруженных систем часто предпочитают альтернативы, такие как Saga или компенсирующие транзакции, которые менее блокирующие и более отказоустойчивые.