Блокировка таблицы WRITE предполагает, что модифицировать данные в этой таблице может только поток, установивший блокировку, а другие потоки не могут ни читать, ни записывать в эту таблицу на протяжении действия этой блокировки.
Вот пример того, как работает блокировка WRITE. Начнем с блокировки WRITE таб­лицы data,
Листинг 12.28.
mysql> LOCK TABLE data WRITE;
Query OK, 0 rows affected (0.05 sec) а затем попробуем прочитать из нее данные.
Блокировка write
Так как таблица заблокирована блокировкой WRITE, можно без каких-либо проблем произвести операцию записи.
Листинг 12.30.
mysql> UPDATE data SET stotal = 5000 WHERE pid = 1 and sid = 'INFY';
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
А что с другими сеансами MySQL? Откроем новый сеанс и попробуем прочитать из той же таблицы при активной блокировке WRITE.
Листинг 12.31.
mysql> SELECT * FROM data;
Здесь клиент MySQL остановится и будет ожидать, пока первый сеанс не снимет бло­кировку перед выполнением предыдущей команды. Поэтому вернемся к первому сеансу и снимем блокировку с таблицы.
Листинг 12.32.
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.04 sec)
А теперь команда SELECT, вызванная первой командой во втором сеансе, будет обра­ботана MySQL, т.к. таблица data больше не пребывает в заблокированном состоянии.
Блокировка write
На быстрой дорожке
В ситуациях, когда применяются как блокировки WRITE, так и блокировки READ, MySQL присваивает блокировкам WRITE более высокий приоритет. Это гарантирует нам более быстрое сохранение изменений на диск. Таким образом, можно снизить риск потери изменений при сбоях в работе диска или системы.
В предыдущих примерах показан один из наиболее существенных недостатков ме­ханизма блокировки таблиц: если поток никогда не снимет свою блокировку, все другие потоки, пытающиеся получить доступ к заблокированным таблицам, будут ожидать таймаута блокировки, что приведет к существенному падению производительности всей системы.