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

Рівні ізоляції

Крім явного FOR UPDATE, транзакції також мають вроджені математичні правила, закладені глибоко в механізм, які визначають, скільки енергії потрібно витрачати, ізолюючи кожну окрему взаємодію за замовчуванням. Це називається Рівнем ізоляції. In the SQL world we know 4 standard ones, in order of power and safety but obviously the inverse in terms of performance.

  • READ UNCOMMITTED: Анархічне божевілля, ваша транзакція бачитиме всі зміни, внесені іншими, включно з тимчасовими даними, отриманими людьми на півдорозі до їхніх власних сценаріїв. Nobody uses it on large DBs, because of constant Dirty Read errors.
  • READ COMMITTED: (за замовчуванням для Postgres). Ви миттєво побачите нові дані, щойно третя сторона видасть COMMIT, але ви можете стати жертвою фантомних зчитувань (побачивши нові записи в середині довгих робочих процесів) або нелінійного узгодженого перегляду.
  • REPEATABLE READ: Важче. Під час вашої великої сесії з часовим вікном я «бачу» базу даних, заморожену на момент початку мого запиту, повністю ігноруючи й не звертаючи уваги навіть на офіційні коміти, виконані іншими людьми! It protects against records magically appearing, guaranteeing stability.
  • 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 спроб