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

Ізоляція. Рівні Repeatable Read та Serializable

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

Repeatable Read

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

Фантомне читання

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

Фантомні читання виникають, коли транзакція повторно виконує запит і знаходить різні набори рядків, які задовольняють початкову умову фільтрації запиту.

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

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

phantom_read

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

Неповторюване читання виникає, коли один і той самий запит, виконаний Користувачем A, повертає різні значення для одного й того ж рядка між послідовними читаннями, зазвичай через зміни, внесені Користувачем B.

Фантомне читання, навпаки, відбувається, коли той самий запит, виконаний Користувачем A, повертає різні набори рядків між послідовними читаннями, навіть якщо окремі рядки не були оновлені.

Ми можемо вказати цей рівень ізоляції у нашому SQL-запиті за допомогою наступної команди:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Serializable

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

Note

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

Можна використати наступний вираз для встановлення цього рівня ізоляції у SQL-запиті:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

question-icon

Відповідність рівнів ізоляції їхнім описам.

Read Uncommitted:
Read Committed:

Repeatable Read:

Serializable:

Click or drag`n`drop items and fill in the blanks

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

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

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

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

Запитати АІ

expand

Запитати АІ

ChatGPT

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

Ізоляція. Рівні Repeatable Read та Serializable

Repeatable Read

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

Фантомне читання

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

Фантомні читання виникають, коли транзакція повторно виконує запит і знаходить різні набори рядків, які задовольняють початкову умову фільтрації запиту.

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

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

phantom_read

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

Неповторюване читання виникає, коли один і той самий запит, виконаний Користувачем A, повертає різні значення для одного й того ж рядка між послідовними читаннями, зазвичай через зміни, внесені Користувачем B.

Фантомне читання, навпаки, відбувається, коли той самий запит, виконаний Користувачем A, повертає різні набори рядків між послідовними читаннями, навіть якщо окремі рядки не були оновлені.

Ми можемо вказати цей рівень ізоляції у нашому SQL-запиті за допомогою наступної команди:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Serializable

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

Note

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

Можна використати наступний вираз для встановлення цього рівня ізоляції у SQL-запиті:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

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

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

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

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