|
Программирование >> Создание клиентов mysql
Транзакции Транзакции применимы лишь к некоторым типам таблиц. Для стандартного типа MylSAM транзакции не поддерживаются. Попытка обновить таблицу тип SAM в рамках транзакции просто приведет к немедленному обновлению таблицы. Это изменение уже нельзя будет отменить. Если транзакции используются довольно часто, можно изменить стандартный тип таблиц, отредактировав файл конфигурации MySQL, как описано в главе 14, Утилиты командной строки . Транзакция отменяется с помощью инструкции ROLLBACK. Если же необходимо принять изменения, воспользуйтесь инструкцией COMMIT. В листинге. 1 показана простая транзакция, завершающаяся откатом. mysql> BEGIN,- Query OK, 0 rows affected (0.01 sec) mysql> SELECT * -> FROM config; + + + \ name \ value \ Ч I- + \ seed \ 12345 \ + + + 1 row in set (0.00 sec) mysql> SELECT @seed:=Value -> FROM config > WHERE Name=seed; + -+ \ @seed:=Value \ + + \ 12345 \ 1 row in set (0.01 sec) mysql> UPDATE config -> SET Value = RAND(@seed)*100000; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> SELECT * -> FROM config; + + + \ name \ value \ + + + \ seed \ 18113 \ + + + 1 row in set (0.00 sec) ROLLBACK; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * -> FROM config; В транзакциях разрешается обновлять таблицы, но только с помощью инструкций INSERT и UPDATE. Изменения схемы базы данных выполняются вне транзакций. Когда вводится инструкция, вносящая изменение в схему, текущая транзакция тут же завершается. К завершению транзакции приводят следующие инструкции: ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP TABLE, RENAME TABLE, TRUNCATE. Блокировки Блокировки - это механизм, применяемый в MySQL дляреализации транзакций и обеспечения одновременного доступа к данным. Помимо этого можно явно запрашивать блокирование таблиц с помощью инструкции LOCK TABLES. Есть также функция GET LOCK(), позволяющая создавать произвольные блокировки. Блокировки работают с любыми таблицами, даже теми, которые не поддерживают транзакции. На внутреннем уровне программа MySQL блокирует таблицы целиком в случае необходимости. Допускается также блокировать строки, столбцы и страницы (под страницей понимается произвольный блок данных, связанных с таблицей). С точки зрения производительности преимущество той или иной модели проявляется по-разному. Табличное блокирование выгодно для Web-приложений. Блокирование на уровне строк лучше подходит для баз данных, в которых часто происходят откаты. Инструкция LOCK TABLES описана в главе 13, Инструкции SQL . С ее помощью можно ставить жесткую и нежесткую блокировки на одну или несколько таблиц. Нежесткая блокировка позволяет потокам осуществлять одновременное чтение данных из таблицы. Жесткая блокировка означает монопольный доступ к таблице со стороны одного-единственного потока. Инструкция UNLOCK TABLES снимает табличные блокировки. Имитировать блокировку на уровне строк можно путем добавления к таблице специального столбца. Ячейки этого столбца будут иметь два состояния: заблокировано и незаблокировано. Тип столбца можно задать как SMALLINT или, лучще, ENUM (подробнее об этих типах рассказывается в главе 11, Типы столбцов и индексов ). В листинге 9.2 приведено описание таблицы, посредством которой контролируется работа водяных насосов на ферме. Насосы расположены в разных местах, и каждый из них можно настроить на прокачку определенного объема воды в час. Программа, написанная на языке С, проверяет таблицу и посылает насосам команды по беспроводной сети. Если программе требуется изменить мощность насоса, она сначала пытается заблокировать строку, устанавливая значение столбца RowLock. В листинге 9.3 показана инструкция, блокирующая строку с идентификатором 2. Блокировки CREATE TABLE pump ( ID INT NOT NULL AUTO INCREMENT, Location INT NOT NULL, Volume FLOAT(5,2) , RowLock ENUM(UNLOCKED , LOCKED PRIMARY KEY(ID) ) NOT NULL, UPDATE pump SET RowLock = WHERE ID = 2; LOCKED Когда СУБД MySQL попытается выполнить эт укцию, может оказаться, что столбец RowLock уже содержит значение LOCKED. MySQL никогдане обновляет строки, если это не приводит к изменению содержащихся в них значений. Следовательно, попытка заблокировать строку, которая до этого уже была кем-то заблокирована, ни к чему не приведет. MySQL сообщит программе о том, что изменению подверглись нуль строк, и программа поймет: со строкой работает другое приложение. Функции GET LOCK() и RELEASE LOCK() реализуют другой механизм блокирования. Эти блокировки не связаны с какими-либо ресурсами и не контролируются самой СУБД. Поэтому их называют программными блокировками, т.е. их контроль должен осуществляться программным путем. У каждой такой блокировки есть имя, и в конкретный момент времени поток может ставить только одну программную блокировку. С помощью указанных функций можно создавать блокировки произвольного уровня детализации. Например, перед каждым обновлением строки можно запрашивать блокировку, имя которой будет состоять из имени таблицы и значения первичного ключа. В случае обновления отдельной ячейки добавляется имя столбца. Рассмотрим листинг 9.4. В первой инструкции запрашивается блокировка ячейки Price строки с идентификатором 3 в таблице item. Обратите внимание на то, что имя блокировки выбрано произвольно. Суть механизма в том, что все приложения придерживаются единого правила именования блокировок. Здесь нет тех издержек, которые свойственны транзакциям, хотя преимущества, посути, те же самые. SELECT К С Price on item.ID=3, 60) UPDATE item SET Price=3.15 WHERE 10=3; SELECT RELEASE LOCK (Price on item.ID=3)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |