1. Классификация замков
1. Разделите по идеям
- Оптимистическая блокировка
всегда оптимистична.Оптимистическая блокировка предполагает, что данные не будут вызывать конфликтов при нормальных обстоятельствах, поэтому конфликты данных будут обнаружены только тогда, когда данные будут отправлены на обновление. Аналоговый CAS - Пессимистическая блокировка
всегда пессимистична.В течение всего процесса обработки данных данные блокируются. Аналогия синхронизирована
2. Разделить по степени детализации
- блокировка строки
- блокировка страницы
- замок стола
3. Разделить по типам
- Общая блокировка (блокировка чтения)
- Эксклюзивная блокировка (блокировка записи)
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. Классификация по типу замка
- Общие (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 .
То есть чтение-чтение совместимо , чтение-запись взаимоисключающее.
- блокировка намерения
InnoDB поддерживает блокировки с несколькими уровнями детализации, позволяя сосуществовать блокировкам строк и блокировкам таблиц.
Чтобы реализовать блокировку на нескольких уровнях детализации, InnoDB использует блокировки намерений . Намеренные блокировки — это блокировки уровня таблицы , которые указывают, какой тип блокировки ( общую или эксклюзивную ) транзакция позже должна будет использовать для строки в таблице .
- Намеренная общая блокировка (IS) указывает, что транзакция намеревается установить общую блокировку
для одной строки в таблице . - Намеренная монопольная блокировка (IX) указывает, что транзакция намеревается установить монопольную блокировку
для одной строки в таблице .
Совместимость замков следующая:
Икс | IX | С | ЯВЛЯЕТСЯ | |
---|---|---|---|---|
Икс | Н | Н | Н | Н |
IX | Н | Да | Н | Да |
С | Н | Н | Да | Да |
ЯВЛЯЕТСЯ | Н | Да | Да | Да |
- Блокировка записей
блокирует записи индекса блокировки при выполнении следующего SQL:
SELECT id FROM student WHERE id = 1;
Индекс с id=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 блокировки пробелов явно отключены.
- Замки следующего ключа
Блокировки 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 использует блокировки следующих ключей для поиска и сканирования индекса, что предотвращает фантомное чтение.