У меня есть вопрос о блокировке mysql/innodb при выборе «FOR UPDATE» в запросе соединения 2 таблицы. Пример:Блокировка MySQL при использовании соединения
2 таблицы - items
, queue
. queue.id
- соединение 1: 1 с items.id (FOREIGN KEY). queue.status
- перечисление с индексом. в очереди очень мало строк, а таблица элементов относительно велика.
SELECT *
FROM `items`
INNER JOIN queue
ON items.id = queue.id
WHERE queue.status = 'new'
FOR UPDATE;
- Будут выбраны строки в таблице
items
исключительно заперта? - Какие еще замки были получены? (за исключением, очевидно, всех строк в таблице
queue
, у которых есть статистика = 'новый'). - Есть ли общие блокировки, которые могут вызвать тупик. Я где-то читал, что вставка помещает следующую ключевую разделяемую блокировку в индекс автоинкремента, а затем при использовании
SELECT ... FOR UPDATE
(в той же транзакции) блокировка обновляется до исключительного, легко зайти в тупик - 2 потока могут получить общую блокировку и то они оба будут ждать друг друга, чтобы освободить замок, чтобы получить эксклюзивный замок. возможно ли это в этом случае (также слышал, что внешние ключи делают общие блокировки).