Оказывается, механизм блокировки MySQL выглядит так

1. Классификация замков

1. Разделите по идеям

  1. Оптимистическая блокировка
    всегда оптимистична.Оптимистическая блокировка предполагает, что данные не будут вызывать конфликтов при нормальных обстоятельствах, поэтому конфликты данных будут обнаружены только тогда, когда данные будут отправлены на обновление. Аналоговый CAS
  2. Пессимистическая блокировка
    всегда пессимистична.В течение всего процесса обработки данных данные блокируются. Аналогия синхронизирована

2. Разделить по степени детализации

  1. блокировка строки
  2. блокировка страницы
  3. замок стола

3. Разделить по типам

  1. Общая блокировка (блокировка чтения)
  2. Эксклюзивная блокировка (блокировка записи)

2. МИСАМ

1. Функции блокировки

MyISAM использует блокировки таблиц . Когда MyISAM выполняет операции запроса и обновления , он добавляет блокировки чтения или блокировки записи ко всем задействованным таблицам.

2. Одновременная вставка

1. Официальные инструкции по одновременной установке MyISAM
Вставьте сюда описание изображения
2. Пояснения

  • Механизм хранения MyISAM поддерживает одновременную вставку , чтобы уменьшить конфликты между блокировками чтения и записи.
  • Если между файлами данных таблицы нет дыр (то есть в середине нет удаленных данных), при выполнении оператора SELECT вы можете выполнить оператор INSERT , чтобы добавить строки данных в конец таблицы (то есть одновременно вставка )
  • Если имеется несколько операторов INSERT , они будут поставлены в очередь и выполнены последовательно, пока выполняется оператор SELECT . Результаты одновременных вставок могут быть видны не сразу .

3. системная переменная concurrent_insert

  • По умолчанию установлено значение АВТО (или 1), которое поддерживает одновременную вставку без отверстий.
  • НИКОГДА (или 0), отключает одновременные вставки.
  • ВСЕГДА (или 2) разрешает одновременные вставки в конец таблицы, даже для таблиц с дырками.

4. Планирование блокировки MyISAM

Для механизмов хранения , которые используют блокировки только на уровне таблицы (таких как MyISAM , MEMORY и MERGE ), приоритет процесса записи выше, чем у процесса чтения.Хотя процесс чтения находится в начале очереди, запись процесс также встанет в очередь .
Вставьте сюда описание изображения

  • Если установить системную переменную low-priority-updates = 1, все операторы INSERT, UPDATE, DELETE и LOCK TABLE WRITE будут ждать, пока не исчезнут ожидающие операции чтения SELECT или LOCK TABLE в затронутой таблице .
  • Уменьшите приоритет оператора , указав атрибут LOW_PRIORITY оператора INSERT, UPDATE и DELETE .

3. ИнноБД

InnoDB поддерживает блокировки строк и таблиц.

1. Классификация по типу замка

  1. Общие (S) блокировки и эксклюзивные (X) блокировки

Транзакция T1 удерживает общую блокировку строки r . В это время запрос другой транзакции T2 на блокировку строки r обрабатывается следующим образом:

  • Блокировка S , запрошенная транзакцией T2 в строке r, может быть предоставлена ​​немедленно , поэтому и T1 , и T2 получат блокировку S для строки r .
  • Запрос транзакции T2 на блокировку X в строке r не может быть удовлетворен немедленно.

Если транзакция T1 удерживает исключительную (X) блокировку строки r , то запрос от другой транзакции T2 не может немедленно предоставить какой-либо тип блокировки строки r . В это время транзакция T2 должна дождаться, пока транзакция T1 снимет блокировку X в строке r .

То есть чтение-чтение совместимо , чтение-запись взаимоисключающее.

  1. блокировка намерения

InnoDB поддерживает блокировки с несколькими уровнями детализации, позволяя сосуществовать блокировкам строк и блокировкам таблиц.

Чтобы реализовать блокировку на нескольких уровнях детализации, InnoDB использует блокировки намерений . Намеренные блокировки — это блокировки уровня таблицы , которые указывают, какой тип блокировки ( общую или эксклюзивную ) транзакция позже должна будет использовать для строки в таблице .

  • Намеренная общая блокировка (IS) указывает, что транзакция намеревается установить общую блокировку
    для одной строки в таблице .
  • Намеренная монопольная блокировка (IX) указывает, что транзакция намеревается установить монопольную блокировку
    для одной строки в таблице .

Совместимость замков следующая:

Икс IX С ЯВЛЯЕТСЯ
Икс Н Н Н Н
IX Н Да Н Да
С Н Н Да Да
ЯВЛЯЕТСЯ Н Да Да Да
  1. Блокировка записей
    блокирует записи индекса блокировки при выполнении следующего SQL:
SELECT id FROM student WHERE id = 1;

Индекс с id=1 будет заблокирован, чтобы предотвратить его вставку, обновление или удаление другими транзакциями.

  1. Замки с зазорами

Блокировка промежутка — это блокировка промежутка между записями индекса или промежутка перед первой записью индекса или после последней записи индекса.

Например,

SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 For UPDATE;

Если какая-либо другая транзакция вставляет значение 15 в столбец t.c1, это не разрешено, поскольку пробел в текущем диапазоне (10–20) заблокирован .

При поиске с использованием уникального индекса блокировки с пробелами не возникнут.

Например:

SELECT * FROM child WHERE id = 100;
  • Если столбец id является единственным индексом, то приведенный выше оператор использует блокировки строк только для строки с id = 100, и блокировка пробелов не будет создана.
  • Если столбец id не проиндексирован или существует вторичный индекс, то этот оператор заблокирует предыдущий пробел.

На уровне изоляции READ COMMITED блокировки пробелов явно отключены.

  1. Замки следующего ключа

Блокировки Next-Key представляют собой комбинацию блокировок записи и блокировок Gap Lock.

Пример: когда транзакция T1 добавляет общую или исключительную блокировку к строке r , она также добавляет блокировку пробела к пробелу перед строкой r . В это время другая транзакция T2 не может вставить новую индексную запись перед строкой r . Предположим, индекс содержит значения 10, 11, 13 и 20. Возможные блокировки следующего ключа для этого индекса охватывают следующий диапазон:

(-∞, 10]
(10, 11]
(11, 13]
(13, 20]
(20, +∞)
Для последнего промежутка блокировка следующего ключа блокирует зазор выше максимального значения в индексе и «положительную бесконечность» ""Фиктивная запись, значение этой псевдозаписи выше, чем любое фактическое значение в индексе. Это не настоящая индексная запись, поэтому на самом деле эта блокировка следующего ключа блокирует пробел только после максимального значения индекса .

По умолчанию InnoDB работает на уровне изоляции транзакции REPEATABLE READ. В этом случае InnoDB использует блокировки следующих ключей для поиска и сканирования индекса, что предотвращает фантомное чтение.

Рекомендации

Официальная документация MySQL:
weblee
tianye_guazi

рекомендация

отblog.csdn.net/qq_41917138/article/details/114399059