написать впереди
Это книга для чтения (тяжелая) (точка) ручка (отрывок) заметка (обязательно) ~Содержание - первая глава "Высокопроизводительного MySQL"~
и Хэппи Танабата, так что сегодняшняя картинка розовая (๑•̀ㅂ•́)و✧
дела
Проще говоря, транзакция — это набор атомарных SQL-запросов, которые либо все выполняются успешно, либо все терпят неудачу. Вот краткое введение в ACID транзакций ACID означает атомарность, согласованность, изоляцию и надежность.
- Атомарность: транзакция представляет собой неделимую минимальную единицу работы, вся транзакция либо завершается успешно, либо завершается неудачно, и невозможно выполнить только часть операции в середине.
- Непротиворечивость: выполнение транзакции означает перемещение базы данных из одного согласованного состояния в другое.Если транзакция окончательно не зафиксирована, изменения, внесенные транзакцией, не будут сохранены в базе данных.
- Изоляция: вообще говоря, транзакция невидима для других транзакций до того, как она будет зафиксирована, но упомянутая здесь невидимость должна учитывать уровень изоляции. Например, незафиксированные операции чтения также видны другим транзакциям до того, как они будут зафиксированы. будет подробно рассмотрено ниже.
- Постоянство: после фиксации транзакции изменения в базе данных будут постоянно сохранены, и измененные данные не будут потеряны даже в случае сбоя базы данных.
уровень изоляции
В стандарте SQL определены четыре уровня изоляции, и вот краткое введение в эти четыре уровня изоляции.
- Незафиксированное чтение: Незафиксированное чтение означает, что изменения в транзакции, даже если они не зафиксированы, видны другим транзакциям, но это приведет к грязным чтениям.В нормальных условиях незафиксированные чтения обычно не используются.
- Фиксация чтения: Фиксация чтения означает, что изменения, сделанные одной транзакцией, невидимы для других транзакций перед фиксацией.Этот уровень также называется «неповторяемым чтением», поскольку выполнение одной и той же операции дважды может привести к разным результатам.
- Повторяющееся чтение: Повторяющееся чтение решает проблему грязных чтений.Этот уровень гарантирует, что результаты многократного чтения одной и той же записи одной и той же транзакцией будут согласованы, но этот уровень изоляции не может решить проблему фантомных чтений.Так называемое фантомное чтение означает, что когда транзакция считывает данные диапазона, другая транзакция вставляет новую запись в диапазон, а когда предыдущая транзакция снова считывает данные диапазона, будет сгенерирована волшебная строка. Механизм хранения InnoDB решает проблему фантомного чтения с помощью MVCC, а повторяющееся чтение является уровнем изоляции транзакций MySQL по умолчанию.
- Сериализация: это самый высокий уровень изоляции, позволяющий избежать проблем с иллюзиями, упомянутых ранее. Squiry будет блокировать каждую строку чтения, поэтому это может привести к большому количеству тайм-аутов и блокировок, которые редко используют этот уровень изоляции.
тупик
Тупик означает, что две или более транзакций занимают друг друга на одном и том же ресурсе и запрашивают блокировку ресурсов, занятых друг другом. Решением тупиковой ситуации является откат одной или нескольких транзакций.
MVCC
MVCC можно рассматривать как вариант блокировки строк. Во многих случаях MVCC может избежать блокировки, поэтому накладные расходы меньше. Различные механизмы хранения транзакций имеют разные реализации MVCC. Реализация MVCC достигается за счет сохранения моментального снимка данных в определенный момент времени. То есть независимо от того, сколько времени требуется для выполнения, данные, видимые каждой транзакцией, непротиворечивы. В зависимости от времени начала транзакции каждая транзакция может одновременно видеть разные данные для одной и той же таблицы. Вот краткое введение в MVCC InnoDB. MVCC InnoDB реализуется путем сохранения двух скрытых столбцов за каждой строкой записей. Эти два столбца, один сохраняет время создания строки, а другой сохраняет время истечения срока действия строки, хранят не фактическое время, а номер версии. Каждый раз, когда запускается новая транзакция, номер версии системы автоматически увеличивается. Номер версии системы в начале транзакции будет использоваться в качестве номера версии транзакции для сравнения с номером версии каждой строки запрашиваемых записей. Конкретная работа MVCC при уровне изоляции повторяемого чтения подробно описана ниже.
- SELECT
- InnoDB проверяет каждую запись на соответствие следующим двум условиям:
- Найти только те строки, версия которых меньше или равна номеру версии транзакции.
- Найти только строки с неопределенным временем удаления или со временем удаления, превышающим номер версии транзакции.
- InnoDB проверяет каждую запись на соответствие следующим двум условиям:
- INSERT
- InnoDB сохраняет текущий номер версии системы в качестве номера версии строки для каждой вновь вставленной строки.
- DELETE
- InnoDB сохраняет текущий номер версии системы для каждой удаленной строки в качестве номера удаленной версии строки.
- UPDATE
- InnoDB добавляет новую запись для сохранения текущего номера версии системы в качестве номера версии новой строки.
- В исходной строке удаленной записи сохраните текущий номер версии системы в качестве удаленного номера версии строки удаленной записи.
преимущество:
- Поскольку есть два скрытых столбца для записи состояния данных, большинство операций чтения можно разблокировать.
- Хорошая производительность при правильном чтении данных
недостаток:
- Требуется дополнительное место для записи состояния каждой строки
- Требуется техническое обслуживание и проверка состояния строки
Как исправить галлюцинации
MVCC использует блокировки пробелов, то есть блокировки следующего ключа, для решения фантомных чтений.Эта часть начинается с трех типов блокировок строк в InnoDB:
- Блокировка записи: блокировка записи одной строки, которая блокирует индекс.
- Gap Lock: блокировка интервала, блокирует диапазон интервалов, но не включает саму запись, открытый интервал
- Блокировка следующей клавиши: блокировка промежутка, блокировка записи + блокировка промежутка
В качестве простого примера
select id from user where id > 15 and id < 30
На диаграмме четко показана блокировка зазора~
Суммировать
Эта глава, кажется, опубликована немного поздно, ее следует разместить перед указателем. Но все равно спасибо за просмотр~ Наконец, я признаюсь своему Пану, муа!(*╯3╰), счастливого китайского Дня Святого Валентина~
Reference
«Высокопроизводительный MySQL»