|
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 не выпускает блокировки таблицы.