0Pricing
SQL Academy · Урок

Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE

Сравните уровни изоляции стандарта SQL и их реализацию в PostgreSQL, а затем выберите подходящий уровень для вашей рабочей нагрузки

«Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Четыре стандартных уровня

Стандарт SQL определяет четыре уровня изоляции:

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

PostgreSQL реализует три из них (READ UNCOMMITTED ведет себя как READ COMMITTED).

READ COMMITTED (уровень PostgreSQL по умолчанию)

Каждый оператор видит данные, зафиксированные до его начала. В рамках одной транзакции Вы можете увидеть разные снимки данных.

-- Inside one transaction:
SELECT balance FROM accounts WHERE id = 1;  -- 100
-- meanwhile another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1;  -- 200  (non-repeatable read)

REPEATABLE READ (изоляция снимка)

Использует снимок, созданный в начале транзакции. Повторное чтение той же строки всегда возвращает одно и то же значение. REPEATABLE READ в PostgreSQL также предотвращает фантомное чтение.

BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = 1;  -- 100
-- another tx commits balance=200
SELECT balance FROM accounts WHERE id = 1;  -- still 100
COMMIT;

SERIALIZABLE

Самый строгий уровень: транзакции выполняются так, словно идут одна за другой. PostgreSQL использует сериализуемую изоляцию снимков (SSI): обнаруживает зависимости между параллельными транзакциями и прерывает конфликтующие транзакции:

BEGIN ISOLATION LEVEL SERIALIZABLE;
...
COMMIT;
-- ERROR: could not serialize access due to read/write dependencies

Настройка уровня изоляции

Для отдельной транзакции, сеанса или глобально:

-- Per transaction:
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- Per session:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- Default for new transactions in this session:
SET default_transaction_isolation = 'repeatable read';

-- Global default in postgresql.conf:
-- default_transaction_isolation = 'read committed'

Аномалии, допускаемые каждым уровнем

УровеньГрязное чтениеНеповторяемое чтениеФантомное чтение
READ UNCOMMITTEDвозможновозможновозможно
READ COMMITTEDнетвозможновозможно
REPEATABLE READнетнетнет (в PG)
SERIALIZABLEнетнетнет

Компромиссы производительности

  • READ COMMITTED — минимальные накладные расходы, уровень по умолчанию
  • REPEATABLE READ — один и тот же план, согласованность снимка, без снижения производительности, если нет конфликтов записи
  • SERIALIZABLE — дополнительные служебные операции, возможен перезапуск транзакций; в приложении нужна логика повторных попыток

Шаблон повторной попытки для SERIALIZABLE

SERIALIZABLE может завершиться с кодом 40001. Повторяйте попытку в цикле:

for (let i = 0; i < 3; i++) {
  try {
    await client.query('BEGIN ISOLATION LEVEL SERIALIZABLE');
    // ... work ...
    await client.query('COMMIT');
    break;
  } catch (e) {
    if (e.code === '40001') continue;
    throw e;
  }
}

Чтение согласованного снимка

Для длительных аналитических запросов, которым нужны согласованные данные, REPEATABLE READ обеспечивает оптимальный баланс.

Поведение при конфликте записи

Если две транзакции изменяют одну и ту же строку:

  • READ COMMITTED — вторая ждет, затем перечитывает новую строку и повторяет операцию
  • REPEATABLE READ — вторая прерывается с сообщением «could not serialize»; приложение должно повторить попытку

Выбор подходящего уровня

Практические рекомендации:

  • OLTP — READ COMMITTED (по умолчанию)
  • Отчеты, требующие согласованности, — REPEATABLE READ
  • Деньги / запасы — SERIALIZABLE с повторной попыткой ИЛИ явные блокировки (FOR UPDATE)

Явные блокировки иногда лучше изоляции

Для одной часто изменяемой строки SELECT ... FOR UPDATE на уровне READ COMMITTED часто проще, чем SERIALIZABLE.

Итоги

Уровни изоляции представляют собой компромисс между безопасностью и параллельностью.

  • READ COMMITTED — уровень по умолчанию
  • REPEATABLE READ — для согласованного чтения
  • SERIALIZABLE — режим «как при последовательном выполнении», требующий повторных попыток

Быстрая проверка

Каков уровень изоляции PostgreSQL по умолчанию?

Часто задаваемые вопросы

Урок «Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE» бесплатный?

Да — полный текст урока «Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE»?

Сравните уровни изоляции стандарта SQL и их реализацию в PostgreSQL, а затем выберите подходящий уровень для вашей рабочей нагрузки Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Свойства ACID и аномалии
  2. Уровни изоляции: READ COMMITTED, REPEATABLE READ, SERIALIZABLE
  3. Взаимные блокировки: обнаружение и предотвращение
  4. Оптимистическая и пессимистическая блокировка
← Назад к SQL Academy