2012-01-30 1 views
4

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

ответ

0

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