linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it worksскоро
  • Уроки
  • База знаний
  • Собеседование
home/postgres/lessons/pg-lab-11-1-isolation-anomalies

lesson ── postgres-labs ── ~25 мин ── 5 шагов

Воспроизведи аномалии и поймай ошибку сериализации

Воспроизведи неповторяющееся чтение на уровне по умолчанию, а потом поймай ошибку сериализации на Serializable - настоящий перекос записи. Перед каждым шагом предсказывай: изменится ли чтение, пройдёт ли коммит.

▶ интерактивный sandbox

Поднимется контейнер postgreslab/postgres-base с PostgreSQL 17 и psql. В браузере откроется терминал, база lab уже настроена. Каждый шаг проверяется автоматически. Сеть air-gapped, наружу контейнер не ходит.

запустить sandbox →

stack ── PostgreSQL 17 · psql · 1 GB RAM · air-gapped · самоуничтожается через 45 мин простоя

Шаги

  1. 01

    Сессия A: первое чтение (Read Committed)

    Во вкладке A (уровень по умолчанию Read Committed) прочитай бронь и запомни значение.

    sql
    SELECT total FROM bookings WHERE book_ref = '000002';

    ✓ Исходное значение брони - 102.00.

  2. 02

    Сессия B: измени и зафиксируй

    Перейди во вкладку B, измени ту же бронь и зафиксируй.

    sql
    UPDATE bookings SET total = 500 WHERE book_ref = '000002';
    COMMIT;

    ✓ B изменила бронь и зафиксировала - теперь 500.00.

  3. 03

    Сессия A: повторное чтение изменилось

    Вернись во вкладку A и прочитай ту же бронь ещё раз. Предскажи: то же значение или новое? На Read Committed снимок берётся на каждый оператор.

    sql
    SELECT total FROM bookings WHERE book_ref = '000002';
    подсказка

    Это и есть неповторяющееся чтение: два одинаковых запроса дали разный ответ.

    ✓ Чтение поменялось: неповторяющееся чтение на Read Committed.

  4. 04

    Подготовь таблицу дежурных

    Во вкладке A создай таблицу дежурных - оба на смене.

    sql
    CREATE TABLE oncall (name text, on_call boolean);
    INSERT INTO oncall VALUES ('alice', true), ('bob', true);

    ✓ Двое на дежурстве - готово к опыту с перекосом записи.

  5. 05

    Перекос записи на Serializable

    Теперь воспроизведи перекос записи. Делай строго по порядку, переключая вкладки.

    Вкладка A:

    sql
    BEGIN ISOLATION LEVEL SERIALIZABLE;
    SELECT count(*) FROM oncall WHERE on_call;   -- видит 2
    UPDATE oncall SET on_call = false WHERE name = 'alice';

    Вкладка B:

    sql
    BEGIN ISOLATION LEVEL SERIALIZABLE;
    SELECT count(*) FROM oncall WHERE on_call;   -- тоже видит 2
    UPDATE oncall SET on_call = false WHERE name = 'bob';

    Вкладка A:

    sql
    COMMIT;   -- проходит

    Вкладка B:

    sql
    COMMIT;   -- ошибка 40001: could not serialize access due to read/write dependencies

    Каждый снял своего, но движок увидел опасную зависимость и откатил B. Предскажи: сколько дежурных осталось на смене?

    подсказка

    Перекос записи: оба прочитали то, что менял другой. Serializable жертвует одной транзакцией.

    ✓ На дежурстве остался один - Serializable не дал перекосу пройти.

Что ты узнал

На Read Committed повторное чтение увидело чужой коммит - неповторяющееся чтение. На Serializable перекос записи пойман: A закоммитилась, B получила 40001, на дежурстве остался ровно один. Высокий уровень изоляции требует повтора по 40001.

команды

  • BEGIN ISOLATION LEVEL SERIALIZABLE;транзакция с гарантией сериализуемости
  • SHOW transaction_isolation;текущий уровень изоляции

концепции

  • · Read Committed берёт снимок на оператор - возможно неповторяющееся чтение
  • · Serializable ловит перекос записи, которого Repeatable Read не видит
  • · конфликт даёт ошибку 40001 - сигнал повторить транзакцию

← предыдущая

Заморозь снимок на Repeatable Read

следующая →

Поймай SELECT, который пишет

Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки