Spec-Zone .ru
спецификации, руководства, описания, API
|
LOCK TABLES
и UNLOCK TABLES
взаимодействуйте с использованием транзакций следующим образом:
LOCK
TABLES
не безопасно от транзакции и неявно фиксирует любую активную транзакцию прежде, чем
попытаться заблокировать таблицы.
UNLOCK
TABLES
неявно фиксации любая активная транзакция, но только если LOCK TABLES
использовался, чтобы получить блокировки таблицы. Например, в
следующем наборе операторов, UNLOCK TABLES
выпускает глобальную блокировку чтения, но не фиксирует
транзакцию, потому что никакие блокировки таблицы не в действительности:
FLUSH TABLES WITH READ LOCK;START TRANSACTION;SELECT ... ;UNLOCK TABLES;
Начало транзакции (например, с START TRANSACTION
) неявно фиксации любая текущая транзакция и выпуски
существующие блокировки таблицы.
FLUSH TABLES WITH READ LOCK
получает глобальную блокировку чтения и не
блокировки таблицы, таким образом, это не подвергается тому же самому поведению как LOCK TABLES
и UNLOCK TABLES
относительно табличной блокировки и неявных фиксаций.
Например, START
TRANSACTION
не выпускает глобальную блокировку чтения. См. Раздел
13.7.6.3,"FLUSH
Синтаксис".
Другие операторы, которые неявно заставляют транзакции фиксироваться, не выпускают существующие блокировки таблицы. Для списка таких операторов см. Раздел 13.3.3, "Операторы Который Причина Неявная Фиксация".
Корректный способ использовать LOCK TABLES
и UNLOCK TABLES
с транзакционными таблицами, такой как InnoDB
таблицы, должен начать транзакцию с SET
autocommit = 0
(нет START TRANSACTION
) сопровождаемый LOCK TABLES
, и не вызывать UNLOCK TABLES
пока Вы не фиксируете транзакцию явно. Например, если Вы
должны записать в таблицу t1
и читайте из таблицы t2
, можно сделать это:
SET autocommit=0;LOCK TABLES t1 WRITE, t2 READ, ...;...
do something with tables t1 and t2 here ...
COMMIT;UNLOCK TABLES;
Когда Вы вызываете LOCK
TABLES
, InnoDB
внутренне берет его собственную блокировку
таблицы, и MySQL берет свою собственную блокировку таблицы. InnoDB
выпускает его внутреннюю блокировку таблицы в следующей фиксации, но для MySQL, чтобы выпустить его
блокировку таблицы, необходимо вызвать UNLOCK TABLES
. Вы не должны иметь autocommit = 1
, потому что тогда InnoDB
сразу выпускает его внутреннюю блокировку таблицы после вызова
LOCK TABLES
,
и мертвые блокировки могут очень легко произойти. InnoDB
не получает
внутреннюю блокировку таблицы вообще если autocommit = 1
, помочь старым приложениям избежать ненужных
мертвых блокировок.
ROLLBACK
не выпускает блокировки таблицы.