Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Ізоляція | Acid
Оптимізація SQL та Особливості Запитів

Ізоляція

Свайпніть щоб показати меню

У контексті баз даних ізоляція означає здатність системи керування базами даних контролювати видимість змін, внесених одночасними транзакціями. Це забезпечує виконання транзакцій незалежно одна від одної, запобігаючи взаємному впливу та підтримуючи цілісність даних.

В SQL існує 4 рівні ізоляції:

  • read uncommitted;
  • read committed;
  • repeatable read;
  • serializable.

Read uncommitted

Це найнижчий рівень ізоляції, при якому транзакції можуть бачити зміни, внесені іншими транзакціями, навіть якщо вони ще не зафіксовані. На цьому рівні допускаються брудні читання, тобто транзакція може читати дані, які були змінені іншою транзакцією, але ще не зафіксовані.

Брудні читання

Note
Дізнайтеся більше

Брудне читання виникає, коли одна транзакція читає дані, які були змінені іншою транзакцією, але ще не зафіксовані.

Наприклад, уявіть дві банківські транзакції, що відбуваються одночасно: Транзакція A перевіряє баланс вашого рахунку, а Транзакція B вносить гроші на ваш рахунок. Якщо Транзакція A бачить збільшений баланс до завершення Транзакції B, це брудне читання, оскільки новий баланс може бути скасований, якщо Транзакція B завершиться невдало.

dirty+read

Реалізація

Щоб вказати рівень ізоляції для транзакції, можна використати наступну команду у запиті:

-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

/* Transaction query */
COMMIT;
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Цей оператор змінює рівень ізоляції для поточної транзакції на "Read Uncommitted", дозволяючи транзакції потенційно читати дані, змінені іншими незавершеними транзакціями;

  • цю команду потрібно використовувати тільки всередині блоку транзакції! В іншому випадку вона не матиме ефекту, і буде застосовано рівень ізоляції за замовчуванням.

Поточний рівень ізоляції можна перевірити за допомогою наступної команди:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Рівень ізоляції Read Committed гарантує, що транзакція бачить лише ті дані, які були зафіксовані іншими транзакціями.
Це означає, що незавершені зміни, зроблені іншими транзакціями, не видно для транзакцій з рівнем ізоляції Read Committed.
У результаті це запобігає "брудному" читанню, дозволяючи транзакції читати лише зафіксовані дані. Однак цей рівень транзакції має проблему з неповторюваними читаннями.

Неповторювані читання

Note
Дізнайтеся більше

Неповторюване читання виникає, коли транзакція читає один і той самий рядок кілька разів у межах однієї транзакції, але отримані дані змінюються між читаннями через зміни, внесені іншими транзакціями. Така непослідовність може призвести до неочікуваної поведінки та некоректних результатів.

Наприклад, уявіть транзакцію, яка двічі запитує баланс рахунку клієнта. Перший запит повертає $1000, але до завершення транзакції інша транзакція вносить $500 на рахунок. Коли виконується другий запит, він показує $1500, що призводить до неповторюваного читання, коли одні й ті самі дані читаються по-різному в межах однієї транзакції через зміни, внесені іншою транзакцією.

Рівень ізоляції "Read committed" дозволяє неповторювані читання, оскільки він блокує операцію читання для значень, які знаходяться у процесі незавершених транзакцій, але не блокує операцію запису.
У результаті можна записувати нові дані в рядок, який наразі читається іншою транзакцією.

Неповторюване читання

Втрачене оновлення

Через відсутність блокування на запис існує ще одна проблема з рівнем ізоляції read committed — втрачені оновлення.

Note
Дізнатися більше

Втрачене оновлення — це ситуація в управлінні базами даних, коли одна транзакція перезаписує зміни, внесені іншою транзакцією, що призводить до втрати даних. Зазвичай це трапляється, коли кілька транзакцій одночасно намагаються оновити одні й ті самі дані, і зміни однієї транзакції перезаписуються іншою транзакцією до того, як вони будуть зафіксовані в базі даних.

Втрачені оновлення виникають, коли дві паралельні транзакції намагаються змінити один і той самий рядок. У результаті транзакція, яка фіксується пізніше, перезаписує значення, зафіксовані іншими транзакціями.

Lost_update

Реалізація

Цей рівень ізоляції можна також вказати за допомогою наступних команд:

-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

/* Transaction query */
COMMIT;

Варто звернути увагу, що Read Committed є рівнем ізоляції за замовчуванням для більшості систем управління базами даних, тому його можна не вказувати окремо.

question mark

Якщо транзакція читає дані, які були змінені іншою незавершеною транзакцією, який це тип читання?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 6

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Ізоляція

У контексті баз даних ізоляція означає здатність системи керування базами даних контролювати видимість змін, внесених одночасними транзакціями. Це забезпечує виконання транзакцій незалежно одна від одної, запобігаючи взаємному впливу та підтримуючи цілісність даних.

В SQL існує 4 рівні ізоляції:

  • read uncommitted;
  • read committed;
  • repeatable read;
  • serializable.

Read uncommitted

Це найнижчий рівень ізоляції, при якому транзакції можуть бачити зміни, внесені іншими транзакціями, навіть якщо вони ще не зафіксовані. На цьому рівні допускаються брудні читання, тобто транзакція може читати дані, які були змінені іншою транзакцією, але ще не зафіксовані.

Брудні читання

Note
Дізнайтеся більше

Брудне читання виникає, коли одна транзакція читає дані, які були змінені іншою транзакцією, але ще не зафіксовані.

Наприклад, уявіть дві банківські транзакції, що відбуваються одночасно: Транзакція A перевіряє баланс вашого рахунку, а Транзакція B вносить гроші на ваш рахунок. Якщо Транзакція A бачить збільшений баланс до завершення Транзакції B, це брудне читання, оскільки новий баланс може бути скасований, якщо Транзакція B завершиться невдало.

dirty+read

Реалізація

Щоб вказати рівень ізоляції для транзакції, можна використати наступну команду у запиті:

-- Start transaction
BEGIN;
-- Set the isolation level for the transaction
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

/* Transaction query */
COMMIT;
  • SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;: Цей оператор змінює рівень ізоляції для поточної транзакції на "Read Uncommitted", дозволяючи транзакції потенційно читати дані, змінені іншими незавершеними транзакціями;

  • цю команду потрібно використовувати тільки всередині блоку транзакції! В іншому випадку вона не матиме ефекту, і буде застосовано рівень ізоляції за замовчуванням.

Поточний рівень ізоляції можна перевірити за допомогою наступної команди:
SHOW TRANSACTION ISOLATION LEVEL;

Read committed

Рівень ізоляції Read Committed гарантує, що транзакція бачить лише ті дані, які були зафіксовані іншими транзакціями.
Це означає, що незавершені зміни, зроблені іншими транзакціями, не видно для транзакцій з рівнем ізоляції Read Committed.
У результаті це запобігає "брудному" читанню, дозволяючи транзакції читати лише зафіксовані дані. Однак цей рівень транзакції має проблему з неповторюваними читаннями.

Неповторювані читання

Note
Дізнайтеся більше

Неповторюване читання виникає, коли транзакція читає один і той самий рядок кілька разів у межах однієї транзакції, але отримані дані змінюються між читаннями через зміни, внесені іншими транзакціями. Така непослідовність може призвести до неочікуваної поведінки та некоректних результатів.

Наприклад, уявіть транзакцію, яка двічі запитує баланс рахунку клієнта. Перший запит повертає $1000, але до завершення транзакції інша транзакція вносить $500 на рахунок. Коли виконується другий запит, він показує $1500, що призводить до неповторюваного читання, коли одні й ті самі дані читаються по-різному в межах однієї транзакції через зміни, внесені іншою транзакцією.

Рівень ізоляції "Read committed" дозволяє неповторювані читання, оскільки він блокує операцію читання для значень, які знаходяться у процесі незавершених транзакцій, але не блокує операцію запису.
У результаті можна записувати нові дані в рядок, який наразі читається іншою транзакцією.

Неповторюване читання

Втрачене оновлення

Через відсутність блокування на запис існує ще одна проблема з рівнем ізоляції read committed — втрачені оновлення.

Note
Дізнатися більше

Втрачене оновлення — це ситуація в управлінні базами даних, коли одна транзакція перезаписує зміни, внесені іншою транзакцією, що призводить до втрати даних. Зазвичай це трапляється, коли кілька транзакцій одночасно намагаються оновити одні й ті самі дані, і зміни однієї транзакції перезаписуються іншою транзакцією до того, як вони будуть зафіксовані в базі даних.

Втрачені оновлення виникають, коли дві паралельні транзакції намагаються змінити один і той самий рядок. У результаті транзакція, яка фіксується пізніше, перезаписує значення, зафіксовані іншими транзакціями.

Lost_update

Реалізація

Цей рівень ізоляції можна також вказати за допомогою наступних команд:

-- Start transaction
BEGIN;
-- Set the isolation level for the session
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

/* Transaction query */
COMMIT;

Варто звернути увагу, що Read Committed є рівнем ізоляції за замовчуванням для більшості систем управління базами даних, тому його можна не вказувати окремо.

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 6
some-alt