Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD-2007-0.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
2.68 Mб
Скачать

10.5. Блокировки

Блокировки – это механизм, применяемый в MySQL для реализации транзакций и обеспечения одновременного доступа к данным. Помимо этого можно явно запрашивать блокирование таблиц с помощью инструкции LOCK TABLES. Синтаксис инструкции приведен в приложении 3.

Есть также функция GET_LOCK(), позволяющая создавать произвольные блокировки. Блокировки работают с любыми таблицами, даже теми, которые не поддерживают транзакций.

С помощью команды LOCK TABLES можно ставить жесткую или нежесткую блокировку на одну или несколько таблиц. Нежесткая блокировка позволяет потокам осуществлять одновременное чтение данных из таблицы. Жесткая блокировка означает монопольный доступ к таблице со стороны одного-единственного потока.

Для снятия блокировок предназначена инструкция UNLOCK TABLES. Кроме того, блокировки снимаются при завершении потока или вводе другой инструкции LOCK TABLES.

Имитировать блокировку на уровне строк можно путем добавления к таблице специального столбца.

CREATE TABLE tabl1

(

ID int NOT NULL AUTO_INCREMENT,

…,

RowLock ENUM(‘UNLOCKED’, ‘LOCKED’) NOT NULL,

PRIMARY KEY (ID)

)

Ячейки этого столбца будут иметь два состояния: заблокировано и не заблокировано. Тип столбца можно задать как SMALLINT или, лучше, ENUM.

10.6. Программные блокировки

Функции GET_LOCK() и RELEASE_LOCK() реализуют другой механизм блокирования. Эти блокировки не связаны с какими-либо ресурсами и не контролируются самой СУБД. Поэтому их называют программными блокировками, т.е. их контроль должен осуществляться программным путем. У каждой такой блокировки есть имя, и в конкретный момент времени поток может ставить только одну программную блокировку.

Формат функции GET_LOCK():

GET_LOCK(имя, тайм-аут)

Функция запрашивает именованную блокировку (имя) на указанное число секунд (тайм-аут) и не завершится, пока не истечет период времени тайм-аута или пока блокировка не будет получена.

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

Примеры программных блокировок:

SELECT GET_LOCK(‘Price on item.ID=3’, 60);

UPDATE item SET Price=3.15 WHERE ID=3;

SELECT RELEASE_LOCK(‘Price on item.ID=3’);

В этом примере запрашивается блокировка ячейки Price строки с идентификатором 3 в таблице item на 60 сек, выполняется модификация данных, затем блокировка отменяется.

Функция GET_LOCK() позволяет создавать произвольные блокировки. Блокировки работают с любыми таблицами, даже теми, которые не поддерживают транзакции.

Одному сеансу может принадлежать только одна блокировка. Вызов функции GET_LOCK() приводит к снятию всех удерживаемых блокировок, но лучше все же снимать их явно с помощью функции RELEASE_LOCK().

Формат функции RELEASE_LOCK()

RELEASE_LOCK(имя)

Функция снимает указанную именованную блокировку, которая ранее была получена с помощью функции GET_LOCK(). Если имя блокировки не было зарегистрировано, возвращается NULL.

На внутреннем уровне программа MySQL блокирует таблицы целиком в случае необходимости. Допускается также блокировать строки, столбцы и страницы (под страницей понимается произвольный блок данных, связанных с таблицей). С точки зрения производительности преимущество той или иной модели проявляется по-разному.

Табличное блокирование выгодно для Web-приложений.

Блокирование на уровне строк лучше подходит для баз данных, в которых часто происходят откаты.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]