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-12-1-hint-bits

lesson ── postgres-labs ── ~20 мин ── 4 шагов

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

Поймай момент, когда чтение меняет страницу. Вставь строку, посмотри на её infomask до и после обычного SELECT. Перед каждым замером предсказывай: стоит ли бит HEAP_XMIN_COMMITTED (значение 256).

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

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

запустить sandbox →

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

Шаги

  1. 01

    Вставь строку

    Создай таблицу и вставь строку. Не читай её обычным SELECT - сначала посмотрим на сырую страницу. Число строк проверим через pageinspect, чтобы не запускать обычное сканирование раньше времени.

    sql
    CREATE TABLE hb (id int);
    INSERT INTO hb VALUES (1);
    SELECT count(*) FROM heap_page_items(get_raw_page('hb', 0));
    подсказка

    heap_page_items читает сырые байты и подсказку не ставит - в отличие от обычного SELECT.

    ✓ Строка на странице. Обычным SELECT её пока не трогали.

  2. 02

    Подсказки фиксации ещё нет

    Посмотри бит HEAP_XMIN_COMMITTED (значение 256) в infomask. Предскажи: стоит ли он сразу после вставки?

    sql
    SELECT (t_infomask & 256) FROM heap_page_items(get_raw_page('hb', 0));
    подсказка

    Подсказку ставит первое чтение строки, а его ещё не было.

    ✓ Бит равен 0 - подсказки фиксации пока нет.

  3. 03

    Сделай обычное чтение

    Теперь выполни обычный SELECT. Он проверяет видимость строки, идёт за статусом в clog и ставит подсказку - а значит, меняет страницу.

    sql
    SELECT * FROM hb;

    ✓ Бит стал 256 - обычный SELECT поставил подсказку и изменил страницу.

  4. 04

    Посмотри весь infomask

    Выведи infomask в битах и найди выставленные флаги: HEAP_XMIN_COMMITTED (бит со значением 256) и HEAP_XMAX_INVALID (нет удаления).

    sql
    SELECT t_infomask::bit(16) FROM heap_page_items(get_raw_page('hb', 0));

    ✓ Видны два флага: xmin зафиксирован, xmax недействителен.

Что ты узнал

Статус транзакции хранится в clog (два бита на транзакцию). Первое обычное чтение строки идёт за статусом в clog и кэширует ответ подсказкой фиксации в t_infomask. Установка подсказки меняет страницу - поэтому SELECT может вызвать запись.

команды

  • SELECT (t_infomask & 256) FROM heap_page_items(get_raw_page('t',0));бит HEAP_XMIN_COMMITTED
  • SELECT t_infomask::bit(16) FROM heap_page_items(get_raw_page('t',0));все флаги infomask

концепции

  • · clog (pg_xact) хранит статус транзакции - два бита на каждую
  • · подсказки фиксации кэшируют статус в строке, чтобы не ходить в clog
  • · первое чтение ставит подсказку и меняет страницу - SELECT пишет

← предыдущая

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

следующая →

Поймай HOT-обновление и поиграй с fillfactor

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