Ой, это снова уровень изоляции базы данных. Всех будет тошнить. В каждом интервью или техническом обмене, связанном с базой данных, всегда будет упоминаться уровень изоляции базы данных. Вы действительно понимаете, каждый уровень изоляции имеет Каковы характеристики и как мы выбираем подходящий уровень изоляции для вещей. (Эта статья предназначена только для ознакомления с базой данных MySQL)
1 Какую проблему решает уровень изоляции транзакций MySQL?
Уровень изоляции транзакций предназначен для решения проблемы параллелизма транзакций.
Проблема параллелизма транзакцийПо сути, это то же самое, что и при написании параллельных программ.вопросы безопасности потокованалогично, проблема безопасности потоков заключается в том, что несколько потоков изменяют переменную одновременно, еслине заблокирован, может появиться что-то вродеПерепроданность этого типа проблемы. Параллелизм транзакций означает, что несколько клиентских подключений изменяют запись в базе данных одновременно, и может возникнуть аналогичная проблема, и транзакция будет отброшена, что увеличивает сложность проблемы.
Мы резюмируем проблемы параллелизма вещей следующим образом:
- Грязное чтение:Транзакция A читает данные, измененные транзакцией B, а затем транзакция B выполняет откат, после чего данные, прочитанные транзакцией A, являются грязными данными.
- Неповторимое чтение:Транзакция A считывает одни и те же данные несколько раз, а транзакция B обновляет и фиксирует данные во время многократного чтения транзакции A, что приводит к несогласованности данных, считанных транзакцией A несколько раз.
- Фантомное чтение:Вещь А изменяет все данные в базе данных в другую форму, но Вещь Б в это время вставляет новый фрагмент данных Это называется фантомным чтением.
Суммировать:
Неповторяющиеся чтения и фантомные чтения легко спутать.Неповторяющиеся чтения фокусируются на модификации, а фантомные чтения фокусируются на добавлениях или удалениях.
Чтобы решить проблему неповторяющегося чтения, вам нужно заблокировать только те строки, которые удовлетворяют условиям, а чтобы решить проблему фантомного чтения, вам нужно заблокировать всю таблицу.
2 Какие существуют уровни изоляции в MySQL?
Стандарт SQL определяет четыре уровня изоляции,
Основываясь на проблеме параллелизма апелляций, MySQL предоставляет нам несколько решений, которые заключаются в следующем (√ Если вы выберете, будут проблемы)
Уровень изоляции транзакции | грязное чтение | неповторяемое чтение | галлюцинации |
---|---|---|---|
незафиксированное чтение | √ | √ | √ |
чтение-фиксация | √ | √ | |
повторяемое чтениедефолт | (√) | ||
сериализуемый |
Каждый уровень изоляции фактически является уровнем блокировки: если какая-либо проблема будет проигнорирована, она не будет заблокирована, а если какая-либо проблема будет решена, параллельное выполнение будет преобразовано в последовательное выполнение.
По мере того, как степень блокировки становится все сильнее и сильнее, одновременная производительность базы данных становится все слабее и слабее.
3 Какие блокировки добавляются к каждому уровню изоляции MySQL?
-
Чтение незафиксированного (отличная производительность, много проблем)
Ситуация блокировки:
- Транзакции не блокируют данные при чтении данных.
- Транзакции добавляют к данным только общие блокировки на уровне строк при изменении данных.
-
Читайте преданные (уровень изоляции часто используется в Интернете, отличная производительность)
Читайте преданные на самом деле для вещей,Не читайте незафиксированные вещи, чтобы не происходило грязных чтений.
Уровень изоляции зафиксированной транзакции чтения:Область изоляции транзакций по умолчанию для большинства популярных баз данных, таких как Oracle, но не область изоляции по умолчанию MySQL.
Ситуация блокировки:Добавит только блокировку записи в индекс
- Текущие делабыть прочитаннымданные плюсобщая блокировка на уровне строки(Блокируется при чтении), как только строка будет прочитана, общая блокировка на уровне строки немедленно снимается;
- В момент, когда транзакция обновляет данные (то есть момент, когда происходит обновление), она должна сначала добавитьэксклюзивная блокировка на уровне строкиДо конца транзакции не было освобождено.
-
повторяемое чтение
Повторяющееся чтение блокирует считанные данные, чтобы гарантировать, что считанные данные непротиворечивы в рамках транзакции.
MySQL добавляет Gap Lock и Next-Key Lock (которые можно установить через файлы конфигурации) для решения проблемы фантомного чтения;
Ситуация блокировки:Чтобы решить проблему фантомного чтения, при поддержке Record Lock он также поддерживает Gap Lock и Next-Key Lock;
- В момент, когда транзакция читает определенные данные (то есть момент, когда она начинает читать), добавляемобщая блокировка на уровне строкиДо конца транзакции не будет освобожден;
- В момент, когда транзакция обновляет определенные данные (то есть момент, когда происходит обновление), добавляемэксклюзивная блокировка на уровне строки, который не освобождается до конца транзакции.
-
сериализовать
Непосредственное изменение параллельного на последовательное эквивалентно выполнению задач в одном потоке с крайне низкой производительностью и обычно не используется.
Ситуация блокировки:
- Когда вы читаете данные, вы должны сначала добавить их.общая блокировка на уровне таблицы, который не освобождается до конца транзакции;
- Когда транзакция обновляет данные, она должна сначала добавитьмонопольная блокировка на уровне таблицы, который не освобождается до конца транзакции.
Рекомендуется предварительно написано два поста в блоге:
Если вы не понимаете концепцию блокировок MySQL, вы можете прочитать "Введение в блокировку MYSQL".
Чтобы оптимизировать производительность блокировки, MySQL использует многоверсионный контроль MVCC. Если вы не понимаете, вы можете прочитать "Вы знаете, как реализован MVCC в MySQL?".
4 Резюме
Уровень изоляции заключается в том, что база данных предоставляет нам право выбора.Что касается производительности и точности данных, мы идем на компромиссы в зависимости от бизнеса.
Для MySQL движок InnonDB будет иметь заявление об уровне изоляции вещей и вещей.