У меня есть вопрос о блокировке mysql / innodb при выборе «FOR UPDATE» в запросе соединения 2 таблиц. Пример:
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
, которые имеют stats = 'new').
- Существуют ли общие блокировки, которые могут привести к тупику. Я где-то читал, что вставка помещает следующую общую блокировку ключа в индекс автоинкремента, а затем при использовании
SELECT ... FOR UPDATE
(в той же транзакции) блокировка обновляется до исключительной, легко возникает тупик - 2 потока могут получить общую заблокировать, и затем они оба будут ждать друг друга, чтобы снять блокировку, чтобы получить эксклюзивную блокировку. Возможно ли в этом случае (также слышал, что внешние ключи делают общие блокировки).