Блокировки в MySQL - статья на webew.ru

Предназначена новичкам для понимания используемого в MySQL механизма блокировок. Агрегат блокирования в MySQL Одновременный доступ нескольких клиентов к данным может приводить к ошибкам. В частности, одновременное читка одним клиентом и запись другим клиентом одних и тех же данных с большрой вероятностью приведет к сбою.


Механизмы блокировок позволяют избежать ситуаций одновременного доступа к данным. MySQL от имени одного из клиентов накладывает блокировку на установленный ресурс, при этом другие клиенты ждут освобождения блокировки. Построчная блокировка достигается посредством усложнения структуры хранилища: в MyISAM архитектура файла с данными представляет собой простое перечисление строк таблицы, тогда как хранилище InnoDB структурировано и поддерживает мультиверсионность данных.


Вследствие этого, InnoDB выигрывает в приложениях, в которых происходит многопоточное трансформирование данных в одну и ту же таблицу, несмотря на необходимые потери на обслуживание больше сложного хранилища. Блокировки бывают двух видов: на чтение и на запись. Если А хочет вписать данные, то другие клиенты не должны ни впитывать текст ни сочинять эти данные покуда А не закончит(write lock).


Блокировка может быть наложена прямо или неявно. Если клиент не назначает блокировку явным образом, MySQL сервер неявно устанавливает потребный тип блокировки на миг выполнения выражения или транзакции. К примеру, в случае выполнения оператора SELECT сервер установит READ LOCK, а в случае UPDATE - WRITE LOCK.


Зачастую возникает надобность выполнения нескольких запросов кряду без вмешательства других клиентов в это пора. Неявная блоктровка не подходит для этих целей, так как устанавливается только на час выполнения одного запроса. В этом случае клиент может очевидно определить, а опосля отменить блокировку с помощью выражений LOCK TABLES и UNLOCK TABLES. Явной блокировка завсегда блокирует всю таблицу, независимо от механизма хранения.


Применение явных блокировок В случае явной блокировки не возбраняется принять выигрыш производительности за счет однократного назначения блокировки и задержки записи обновленных индексов до на момент блокировки. Для ранних версий, необходимо установливать блокировку на все таблицы, входящие в представление.


Разрыв соединения илм завершение сессии автоматически снимает все установленные в рамках данной сессии блокировки. Блокировка таблиц может быть нарушена транзакцией и напротив. START TRANSACTION неявным образом осуществляет UNLOCK TABLES и наоборот LOCK TABLES откатывает незаконченную транзакцию. Для установки блокировки требуется обладать привилегии LOCK TABLES и SELECT на каждую блокируемую таблицу.


Если одна из требуемых таблиц заблокирована в рамках иной сессии, то оператор блокировки не выполнится в то время как все таблицы не освободятся. Типы блокировок: READ - блокирует таблицу для чтения. Все клиенты могут обретать данные в то же время, но никто не может их изменять, более того тот клиент, тот, что установил блокировку. WRITE - блокирует таблицу для записи.


Только клиент установивший блокировку может получать и изменять данные. Применимо только к таблицам MyISAM, которые не имеют дыр, образованных в результате изменения или удаления строк. В этом случае, добавление новых данных производится в финал таблицы. Если таблица имеет дыры, то их разрешается устранить, используя оператор OPTIMIZE TABLE. LOW PRIORITY WRITE - блокирует таблицу для записи, но во период ожидания блокировки пропускает тех клиентов, которые стоят в очереди на получения блокировки типа READ.


Примечание: системная переменная concurrent inserts определяет вероятность добавления данных в конец таблицы MyISAM, заблокированной для чтения. По умолчанию, эта переменная равна 1, что означает возможность добавления данных при отсутствии в таблице дыр. Таким образом, в случае неявной блокировки, для таблиц MyISAM устанавливается READ LOCAL, а не READ.


Значимость concurrent inserts равное 0 запрещает добавление данных параллельно с чтением, а равное 2 разрешает вставку данных в конец таблицы даже при наличии в таблице дыр. Заключение В статье рассмотрены только основные вопросы использования блокировок в MySQL. Не освещены транзакции, уровни изоляции, advisory lock и др. Напишите в комментариях какие из вопросов вам интересны. Все права на данную статью принадлежат порталу webew.ru.


Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.



По материалам http://webew.ru/articles/1383.webew


Комментарии к этой заметке больше не принимаются.


октябрь, 2008
пн вт ср чт пт сб вс
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31