Программирование >>  Создание клиентов mysql 

1 ... 31 32 33 [ 34 ] 35 36 37 ... 201



Транзакции

Транзакции применимы лишь к некоторым типам таблиц. Для стандартного типа 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)



1 ... 31 32 33 [ 34 ] 35 36 37 ... 201

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика