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-10-1-snapshot

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

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

Посмотри на снимок в SQL и убедись, что на Repeatable Read он заморожен: чужой коммит, случившийся после старта транзакции, в неё не просочится. Перед каждым чтением предсказывай результат.

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

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

запустить sandbox →

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

Шаги

  1. 01

    Сессия A: посмотри снимок

    Во вкладке A посмотри текущий снимок и разбери его на три части xmin:xmax:список.

    sql
    SELECT pg_current_snapshot();
    подсказка

    Формат - два числа через двоеточие и список активных xid.

    ✓ Снимок - это числа, а не копия данных.

  2. 02

    Сессия A: заморозь транзакцию

    Открой транзакцию на Repeatable Read и прочитай число билетов. Запомни его - снимок взялся прямо сейчас и держится до конца транзакции.

    sql
    BEGIN ISOLATION LEVEL REPEATABLE READ;
    SELECT count(*) FROM tickets;
    подсказка

    На Repeatable Read снимок один на всю транзакцию.

    ✓ Транзакция A открыта с замороженным снимком.

  3. 03

    Сессия B: добавь билет и зафиксируй

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

    sql
    INSERT INTO tickets VALUES ('9999999999999', '000001', 1, 'NEW');
    COMMIT;

    ✓ B вставила билет и зафиксировала - билетов стало 501.

  4. 04

    Сессия A: чтение заморожено

    Вернись во вкладку A и снова прочитай число билетов. Предскажи: увидишь ли вставку сессии B? В своей транзакции ты по-прежнему видишь старое число (500): снимок заморожен. А свежее соединение - вроде этой проверки - уже видит 501.

    sql
    SELECT count(*) FROM tickets;
    подсказка

    Снимок A взялся до коммита B, поэтому вставка B в него не попала.

    ✓ Свежее соединение видит 501, а замороженная транзакция A - всё ещё 500.

  5. 05

    Сессия A: заверши транзакцию

    Заверши транзакцию A. Теперь её снимок сброшен, и повторное чтение увидит вставку сессии B.

    sql
    COMMIT;
    SELECT count(*) FROM tickets;

    ✓ Транзакция A закрыта - больше нет замороженных снимков.

Что ты узнал

Снимок - это числа xmin:xmax:список, а не копия. На Repeatable Read он берётся один раз на транзакцию и держится до конца: чужой коммит после старта в транзакцию не просачивается, хотя свежее соединение его видит.

команды

  • SELECT pg_current_snapshot();снимок в формате xmin:xmax:список
  • BEGIN ISOLATION LEVEL REPEATABLE READ;заморозить снимок на транзакцию

концепции

  • · снимок - несколько чисел плюс правило видимости, не копия данных
  • · на Repeatable Read снимок один на всю транзакцию
  • · видимость зависит от соединения: у каждого свой снимок

← предыдущая

Увидь многоверсионность на двух сессиях

следующая →

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

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