lesson ── postgres-labs ── ~22 мин ── 4 шагов
Открыты две сессии к одной базе - вкладки A и B. Увидь многоверсионность в действии: сессия B не видит незакоммиченных изменений сессии A. Перед каждым чтением в B предсказывай, какое значение она покажет.
интерактивный sandbox
Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.
stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя
Перейди во вкладку A. Начни транзакцию и измени бронь, но не коммить.
Обрати внимание на звёздочку в приглашении lab=*# - идёт транзакция.
BEGIN;
UPDATE bookings SET total = 999 WHERE book_ref = '000001';
Не коммить - пусть транзакция остаётся открытой.
✓ Транзакция A открыта и держит незакоммиченное изменение.
Перейди во вкладку B. Предскажи: что покажет чтение прямо сейчас, пока A не закоммитила?
SELECT total FROM bookings WHERE book_ref = '000001';
Незакоммиченное изменение видно только той сессии, что его сделала.
✓ B видит старое значение 101.00 - изменения A ей не видны.
Вернись во вкладку A и заверши транзакцию. Звёздочка в приглашении пропадёт.
COMMIT;
✓ Транзакция зафиксирована, новая версия теперь общедоступна.
Вернись во вкладку B. Предскажи, что покажет повторное чтение теперь, после коммита A.
SELECT total FROM bookings WHERE book_ref = '000001';
✓ Теперь B видит 999.00 - после коммита новая версия видна всем.
Многоверсионность на двух сессиях: пока A держала незакоммиченную запись, B видела старую версию и не ждала. После COMMIT новая версия стала видна всем. Читатель и писатель не блокировали друг друга.
команды
BEGIN; UPDATE ...;открыть транзакцию и изменить строкуSELECT ... FROM bookings;чтение видит свою версиюCOMMIT;сделать новую версию общедоступнойконцепции