Блокировка, осуществляемая различными операторами SQL в InnoDB
SELECT ... FROM ...: согласованное чтение, которое производится из
образа базы данных без блокировки.
SELECT ... FROM ... LOCK IN SHARE MODE: устанавливает совместно
используемую блокировку следующего ключа на все считываемые индексные
записи.
SELECT ... FROM ... FOR UPDATE: устанавливает эксклюзивную блокировку
следующего ключа на все считываемые индексные записи.
INSERT INTO ... VALUES (...): устанавливает эксклюзивную блокировку
на вставленную строку. Обратите внимание, что эта блокировка не
является блокировкой следующего ключа и не предотвращает вставку
другими пользователями записей в интервал перед вставленной строкой.
Если произойдет ошибка дублирующегося ключа, оператор устанавливает
блокировку совместного доступа на запись дублирующегося индекса.
INSERT INTO T SELECT ... FROM S WHERE ... устанавливает эксклюзивную
(не следующего ключа) блокировку на каждую вставляемую в T строку.
Осуществляет поиск по S как согласованное чтение, но устанавливает
блокировки совместного доступа к следующему ключу на S, если включено
ведение журнала MySQL. InnoDB в последнем случае должен устанавливать
блокировки, так как при восстановлении работоспособности системы с
повтором всех завершенных транзакций из резервной копии все операторы
SQL должны запускаться точно таким же образом, как и изначально.
CREATE TABLE ... SELECT ... выполняет операцию SELECT как
согласованное чтение или совместную блокировку, как и в предыдущем
пункте.
REPLACE осуществляется так же, как и вставка, если нет конфликтов
уникальных ключей. В противном случае эксклюзивная блокировка
следующего ключа будет установлена на строку, которая должна быть
обновлена.
UPDATE ... SET ... WHERE ...: устанавливает эксклюзивную блокировку
следующего ключа для каждой записи, по которой производится поиск.
DELETE FROM ... WHERE ...: устанавливает эксклюзивную блокировку
следующего ключа для каждой записи, по которой производится поиск.
Если для таблицы определены ограничения FOREIGN KEY, для любой
вставки, обновления или удаления, для которых требуется проверка
условий ограничения, устанавливается совместная блокировка на уровне
записей, которые просматриваются для проверки ограничения. В InnoDB
эти блокировки устанавливаются также в случае нарушения ограничения.
LOCK TABLES ...: устанавливает блокировку таблицы. Эта блокировка
производится кодом уровня MySQL. Механизм автоматического обнаружения
взаимоблокировок (deadlock) InnoDB не может детектировать
взаимоблокировки, в которых участвуют такие блокировки таблиц (см.
следующий раздел). Кроме того, поскольку MySQL ``знает'' о блокировке
на уровне строки, возможно установление блокировки таблицы, в которой
другой пользователь заблокировал строки. Но это не опасно для
целостности транзакции. See section 7.5.14 Ограничения для таблиц InnoDB.