Блокировка MySQL при использовании соединения - PullRequest
4 голосов
/ 30 января 2012

У меня есть вопрос о блокировке 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;
  1. Будут ли выбранные строки в таблице items исключительно заблокированы?
  2. Какие еще блокировки получаются? (за исключением, очевидно, всех строк в таблице queue, которые имеют stats = 'new').
  3. Существуют ли общие блокировки, которые могут привести к тупику. Я где-то читал, что вставка помещает следующую общую блокировку ключа в индекс автоинкремента, а затем при использовании SELECT ... FOR UPDATE (в той же транзакции) блокировка обновляется до исключительной, легко возникает тупик - 2 потока могут получить общую заблокировать, и затем они оба будут ждать друг друга, чтобы снять блокировку, чтобы получить эксклюзивную блокировку. Возможно ли в этом случае (также слышал, что внешние ключи делают общие блокировки).

1 Ответ

0 голосов
/ 09 июня 2012

Да, каждая выбранная строка (*) будет заблокирована. Вам действительно не нужно беспокоиться о тупике. На его создание уходит довольно много времени, и когда это происходит, в основном это вина клиента.

...