Перейти к основному содержимому
Модуль 11 · Урок 4 из 444/57 в курсе~12 min
Уроки модуля (4/4)

Уровни изоляции

Помимо явного FOR UPDATE, транзакции также имеют встроенные математические правила, встроенные глубоко в механизм, которые по умолчанию определяют, сколько энергии нужно потратить на изоляцию каждого отдельного взаимодействия. Это называется Уровнем изоляции. В мире SQL мы знаем четыре стандартных, расположенных в порядке мощности и безопасности, но, очевидно, противоположных с точки зрения производительности.

  • READ UNCOMMITTED: Анархическое безумие, ваша транзакция будет видеть все изменения, внесенные другими, включая временные данные от людей, находящихся на полпути к выполнению своих собственных сценариев. На больших БД его никто не использует из-за постоянных ошибок Dirty Read.
  • READ COMMITTED: (по умолчанию для Postgres). Вы мгновенно увидите новые данные, как только третья сторона выполнит COMMIT, но вы можете стать жертвой фантомного чтения (обнаружения новых записей в середине длительного рабочего процесса) или нелинейного последовательного представления.
  • REPEATABLE READ: Тяжелее. На протяжении вашего сеанса с большим временным окном я «вижу» базу данных замороженной в момент начала моего запроса, полностью игнорируя и игнорируя даже официальные коммиты, выполненные другими людьми! Он защищает от магического появления записей, гарантируя стабильность.
  • SERIALIZABLE: Уровень Бога (Супер медленный). Обрабатывает каждую перекрывающуюся транзакцию, блокируя их и выполняя последовательно в одной полосе, безжалостно прерывая те, которые конфликтуют, устраняя на корню даже научную возможность малейшего конфликта, жертвуя твердыми 90% высокой пропускной способности.

Как вы это устанавливаете?

Вместо обычного BEGIN; вы вводите:

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

Или в некоторых вариантах и ​​более старых двигателях вы назначаете его после запуска:

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Попробуйте сами

Упражнение#sql.m11.l4.e1
Попыток: 0Загрузка…

Запустите транзакцию, формально установив глобальный уровень на время существования запроса на REPEATABLE READ, чтобы создать замороженный защищенный обмен.\nПомните, что на уровне запроса он не имеет смысла, если за ним не последует что-то еще, поэтому закройте его пустым с помощью 'COMMIT'.

Загрузка редактора…
Показать подсказку

Открыть с помощью BEGIN ISOLATION LEVEL REPEATABLE READ; и закрыть с помощью COMMIT;

Решение доступно после 3 попыток

Упражнение#sql.m11.l4.e2
Попыток: 0Загрузка…

Давайте попробуем сумасшедший сериализуемый уровень и вставим несколько вымышленных данных.\nОткройте блок «SERIALIZABLE».\nОбновите имя категории Id=2 на «Nuovo Nome Segreto».\nЗапустите последний атомарный, фиксирующий коммит.

Загрузка редактора…
Показать подсказку

НАЧАТЬ УРОВЕНЬ ИЗОЛЯЦИИ СЕРИАЛИЗИРУЕМЫЙ;\nОБНОВЛЕНИЕ категорий SET name = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;

Решение доступно после 3 попыток