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 Раздел 7.5.13, «Ограничения для таблиц InnoDB».