Изоляция
На этой недели добиваем серию постов про A C I D
🔤Isolation (изоляция) гарантирует, что одновременно выполняемые транзакции не будут мешать промежуточным состояниям друг друга.
По сути, пока транзакция выполняется, ее обновления (или промежуточные данные) остаются невидимыми для других текущих транзакций, создавая иллюзию того, что каждая транзакция выполняется последовательно, по одной за раз.
Без изоляции две или более транзакции могли бы считывать и записывать частичные или незафиксированные данные друг друга, что приводило бы к неверным или непоследовательным результатам.
Аномалии параллелизма
Чтобы понять, как работает изоляция, полезно рассмотреть, что может пойти не так без надлежащей изоляции. К распространённым аномалиям параллелизма относятся:
1. Dirty Read (грязное чтение)
• Транзакция A считывает данные, которые транзакция B изменила, но еще не зафиксировала.
• Если транзакция B затем откатывается, транзакция A в конечном итоге содержит недействительное или «грязное» значение, которое на самом деле никогда не существовало в зафиксированном состоянии.
2. Non-Repeatable Read (неповторяемое чтение)
• Транзакция A считывает одни и те же строки несколько раз во время своего выполнения, но видит разные данные, поскольку другая транзакция обновила или удалила эти строки между чтениями A.
3. Phantom Read (фантомное чтение)
• Транзакция A выполняет запрос, возвращающий набор строк. Другая транзакция вставляет, обновляет или удаляет строки, соответствующие условиям запроса A.
• Если A повторно выполнит тот же запрос, он увидит другой набор строк («фантомов»).
Уровни изоляции
Базы данных обычно позволяют выбрать уровень изоляции , который обеспечивает баланс между корректностью данных и производительностью.
Более высокие уровни изоляции обеспечивают более высокую согласованность данных, но могут снизить производительность системы за счет увеличения времени ожидания транзакций.
Давайте рассмотрим четыре распространенных уровня изоляции:
1. Read Uncommitted
• Позволяет выполнять «грязное» чтение; транзакции могут видеть незафиксированные изменения.
• Используется редко, так как может привести к серьезным аномалиям.
2. Read Committed
• Транзакция видит только те данные, которые были зафиксированы на момент чтения.
• Предотвращает «грязное» чтение, но неповторяющиеся чтения и фантомные чтения все еще могут возникать.
3. Repeatable Read
• Гарантирует, что при многократном чтении одних и тех же строк в рамках транзакции вы получите одни и те же значения.
• Предотвращает грязное чтение и неповторяющееся чтение, но фантомное чтение все равно может происходить (в зависимости от ядра базы данных).
4. Serializable
• Самый высокий уровень изоляции, при котором все транзакции происходят последовательно, по одной за раз.
• Предотвращает грязное чтение, неповторяющееся чтение и фантомное чтение.
• Самый затратный с точки зрения производительности и параллелизма вариант, поскольку может потребовать больше блокировок или проверок конфликтов.
Как базы данных обеспечивают изоляцию
1. Блокировка
• Пессимистический контроль параллелизма
- Строки или таблицы блокируются, так что никакая другая транзакция не сможет прочитать или записать их, пока блокировка не будет снята.
- Может привести к блокировке или взаимоблокировке, если несколько транзакций конкурируют за одни и те же блокировки.
2. MVCC (управление многоверсионным параллелизмом)
• Оптимистическое управление параллелизмом
- Вместо блокировки чтения база данных хранит несколько версий строки.
- Читатели видят согласованный снимок данных, тогда как писатели создают новую версию строки при обновлении.
- Такой подход снижает количество конфликтов блокировок, но требует тщательного управления версиями строк и очистки.
3. Изоляция моментального снимка
• Форма MVCC, при которой каждая транзакция видит данные такими, какими они были в начале (или в определенной точке) транзакции.
• Предотвращает неповторяющиеся и «грязные» чтения. Фантомные чтения могут возникать, если уровень изоляции не является полностью сериализуемым.
На этой недели добиваем серию постов про A C I D
🔤Isolation (изоляция) гарантирует, что одновременно выполняемые транзакции не будут мешать промежуточным состояниям друг друга.
По сути, пока транзакция выполняется, ее обновления (или промежуточные данные) остаются невидимыми для других текущих транзакций, создавая иллюзию того, что каждая транзакция выполняется последовательно, по одной за раз.
Без изоляции две или более транзакции могли бы считывать и записывать частичные или незафиксированные данные друг друга, что приводило бы к неверным или непоследовательным результатам.
Аномалии параллелизма
Чтобы понять, как работает изоляция, полезно рассмотреть, что может пойти не так без надлежащей изоляции. К распространённым аномалиям параллелизма относятся:
1. Dirty Read (грязное чтение)
• Транзакция A считывает данные, которые транзакция B изменила, но еще не зафиксировала.
• Если транзакция B затем откатывается, транзакция A в конечном итоге содержит недействительное или «грязное» значение, которое на самом деле никогда не существовало в зафиксированном состоянии.
2. Non-Repeatable Read (неповторяемое чтение)
• Транзакция A считывает одни и те же строки несколько раз во время своего выполнения, но видит разные данные, поскольку другая транзакция обновила или удалила эти строки между чтениями A.
3. Phantom Read (фантомное чтение)
• Транзакция A выполняет запрос, возвращающий набор строк. Другая транзакция вставляет, обновляет или удаляет строки, соответствующие условиям запроса A.
• Если A повторно выполнит тот же запрос, он увидит другой набор строк («фантомов»).
Уровни изоляции
Базы данных обычно позволяют выбрать уровень изоляции , который обеспечивает баланс между корректностью данных и производительностью.
Более высокие уровни изоляции обеспечивают более высокую согласованность данных, но могут снизить производительность системы за счет увеличения времени ожидания транзакций.
Давайте рассмотрим четыре распространенных уровня изоляции:
1. Read Uncommitted
• Позволяет выполнять «грязное» чтение; транзакции могут видеть незафиксированные изменения.
• Используется редко, так как может привести к серьезным аномалиям.
2. Read Committed
• Транзакция видит только те данные, которые были зафиксированы на момент чтения.
• Предотвращает «грязное» чтение, но неповторяющиеся чтения и фантомные чтения все еще могут возникать.
3. Repeatable Read
• Гарантирует, что при многократном чтении одних и тех же строк в рамках транзакции вы получите одни и те же значения.
• Предотвращает грязное чтение и неповторяющееся чтение, но фантомное чтение все равно может происходить (в зависимости от ядра базы данных).
4. Serializable
• Самый высокий уровень изоляции, при котором все транзакции происходят последовательно, по одной за раз.
• Предотвращает грязное чтение, неповторяющееся чтение и фантомное чтение.
• Самый затратный с точки зрения производительности и параллелизма вариант, поскольку может потребовать больше блокировок или проверок конфликтов.
Как базы данных обеспечивают изоляцию
1. Блокировка
• Пессимистический контроль параллелизма
- Строки или таблицы блокируются, так что никакая другая транзакция не сможет прочитать или записать их, пока блокировка не будет снята.
- Может привести к блокировке или взаимоблокировке, если несколько транзакций конкурируют за одни и те же блокировки.
2. MVCC (управление многоверсионным параллелизмом)
• Оптимистическое управление параллелизмом
- Вместо блокировки чтения база данных хранит несколько версий строки.
- Читатели видят согласованный снимок данных, тогда как писатели создают новую версию строки при обновлении.
- Такой подход снижает количество конфликтов блокировок, но требует тщательного управления версиями строк и очистки.
3. Изоляция моментального снимка
• Форма MVCC, при которой каждая транзакция видит данные такими, какими они были в начале (или в определенной точке) транзакции.
• Предотвращает неповторяющиеся и «грязные» чтения. Фантомные чтения могут возникать, если уровень изоляции не является полностью сериализуемым.