Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Питання на співбесіді: Транзакції й блокування

Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.

16 питань

Двофазний коміт (2PC) - протокол, щоб кілька незалежних баз (чи ресурсів) закомітили спільну транзакцію атомарно: або всі, або жодна.

  1. Фаза підготовки: координатор просить кожного учасника підготуватися. Учасник виконує все, крім фіксації, гарантує, що зможе закомітити навіть після перезапуску, і відповідає «готовий».
  2. Фаза фіксації: якщо готові всі - координатор надсилає COMMIT кожному; якщо хтось відмовив - ROLLBACK усім.

У PostgreSQL це команди:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
PREPARE TRANSACTION 'transfer-42';     -- фаза 1

-- пізніше, за рішенням координатора
COMMIT PREPARED 'transfer-42';         -- фаза 2
-- або ROLLBACK PREPARED 'transfer-42';

За замовчуванням вимкнено: max_prepared_transactions = 0.

Чому в застосунках його уникають:

  • Блокування на час координації. Підготовлена транзакція тримає блокування й горизонт вакууму, доки координатор не прийме рішення. Якщо координатор упав між фазами, транзакція «зависає» - її доводиться розв'язувати вручну, а тим часом таблиці роздуваються.
  • Координатор - єдина точка відмови й складна частина системи, яку треба писати й підтримувати.
  • Не всі учасники підтримують 2PC: зовнішні API, черги, пошта не вміють «підготуватися».
  • Знижує доступність: транзакція можлива, лише коли доступні всі учасники.

Що використовують натомість:

  • Одна база - найпростіше, якщо дані можна тримати разом.
  • Transactional outbox: подія записується в ту саму базу, що й зміна, в одній транзакції, а окремий процес надійно відправляє її далі.
  • Саги - послідовність локальних транзакцій з компенсуючими діями при збої («скасувати бронювання, якщо оплата не пройшла»).
  • Ідемпотентність і повтори замість атомарності між системами.

Докладніше в документації: PREPARE TRANSACTION