причина:
Для нескольких сеансов sql из-за конкуренции за ресурсы обе стороны ожидают освобождения блокировки, и в это время произойдет взаимоблокировка.
тип блокировки mysql:
Общая блокировка, блокировка чтения, блокировка S: несколько транзакций могут совместно использовать блокировку для одних и тех же данных и могут только читать, но не записывать.
Эксклюзивная блокировка, блокировка записи, блокировка X: только одна транзакция может получить ее одновременно. Когда данные заблокированы, другие транзакции не могут их изменить.
Блокировка намерения ix — это
транзакция A, которая изменяет запись r пользовательской таблицы, она дает записи r монопольную блокировку на уровне строки (X) и в то же время дает пользовательской таблице монопольную блокировку намерения (IX) , В это время транзакция B предоставит
монопольную блокировку на уровне таблицы для пользовательской таблицы. Таким образом, блокировки намерений реализуют сосуществование блокировок строк и блокировок таблиц и отвечают требованиям изоляции транзакций.
пример:
t1:
начать транзакцию;
выберите * из fenqu, где id=30 для обновления;
обновить тестовый набор code=30, где id=31;
t2:
начать транзакцию;
выберите * из fenqu, где id=31 для обновления;
обновить тестовый набор code=31, где id=30;
t1 изменяет 31 после блокировки 30, а t2 изменяет 30 после блокировки 31. В
это время, поскольку 30 и 31 оба установлены с эксклюзивными блокировками, они ждут освобождения другой стороны, таким образом образуя взаимоблокировку.
План быстрого устранения неполадок:
Вариант первый:
запрос таблицы
В собственной библиотеке mysql есть две таблицы INFORMATION_SCHEMA:
INNODB_LOCKS: Предоставляет информацию о каждой блокировке, которую транзакция InnoDB запросила, но еще не получила, и о каждой блокировке, удерживаемой транзакцией, которая предотвращает другую транзакцию.
INNODB_LOCK_WAITS: содержит одну или несколько строк для каждой заблокированной транзакции InnoDB с указанием запрошенных блокировок и любых блокировок, блокирующих этот запрос.
ВЫБЕРИТЕ * ИЗ INFORMATION_SCHEMA.INNODB_LOCKS;
Идентификатор транзакции 249187 заблокирован блокировкой с идентификатором 249119
Вариант 2:
запрос журнала
ПОКАЗАТЬ СТАТУС ДВИГАТЕЛЯ INNODB;
третье решение:
При использовании облачных сервисов Alibaba;
ApsaraDB для DAS -> выбор экземпляра -> производительность в реальном времени -> анализ блокировок -> немедленная диагностика;