Питання на співбесіді: Транзакції й блокування
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
Всі теми
JSON і повнотекстовий пошук
Експлуатація БД
Індекси
Можливості SQL у PostgreSQL
Продуктивність запитів
Проєктування схеми
Типи даних
Транзакції й блокування
Функції, тригери й розширення
16 питань
Двофазний коміт (2PC) - протокол, щоб кілька незалежних баз (чи ресурсів) закомітили спільну транзакцію атомарно: або всі, або жодна.
- Фаза підготовки: координатор просить кожного учасника підготуватися. Учасник виконує все, крім фіксації, гарантує, що зможе закомітити навіть після перезапуску, і відповідає «готовий».
- Фаза фіксації: якщо готові всі - координатор надсилає
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: подія записується в ту саму базу, що й зміна, в одній транзакції, а окремий процес надійно відправляє її далі.
- Саги - послідовність локальних транзакцій з компенсуючими діями при збої («скасувати бронювання, якщо оплата не пройшла»).
- Ідемпотентність і повтори замість атомарності між системами.