MySQL / 15. Выполнение транзакций

Проверка поддержки транзакций

Задача
Вы хотите использовать транзакции, но не знаете, поддерживает ли их ваш сервер MySQL.

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

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

mysql> SELECT VERSION();

+----------------+
| VERSION()    |
+----------------+
| 4.0.4-beta-log |
+----------------+

Поддержка транзакций была введена в версии MySQL 3.23.17 с включением таблиц BDB (Berkeley DB) транзакционного типа. С того времени появился еще тип InnoDB, и, начиная с MySQL 3.23.29, можно работать с обоими типами таблиц. Я бы рекомендовал использовать последнюю из доступных версий MySQL. Поддержка транзакций (как и сам сервер) была значительно усовершенствована с момента выхода версии 3.23.29.

Даже если сервер достаточно современен для того, чтобы обеспечивать поддержку транзакций, может оказаться, что на самом деле он не обладает такими возможностями. Обработчики соответствующих типов таблиц могли быть не сконфигурированы при компиляции сервера. Может оказаться, что обработчики присутствуют, но отключены – если сервер был запущен с опцией --skip-bdb или --skip-innodb. Чтобы проверить доступность и статус обработчиков транзакционных таблиц, используйте предложение SHOW VARIABLES:

mysql> SHOW VARIABLES LIKE 'have_bdb';

+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| have_bdb       | YES   |
+----------------+-------+

mysql> SHOW VARIABLES LIKE 'have_innodb';

+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| have_innodb   | YES   |
+----------------+-------+

Приведенный результат запроса показывает, что таблицы BDB и InnoDB могут быть использованы. Если бы какой-то из запросов не возвращал значения или выводил в столбце Value что-то отличное от YES (NO или DISABLED), то соответствующий тип таблиц был бы недоступен.Еще один способ проверки доступности определенного типа таблиц – попытаться создать таблицу такого типа. Создайте предложение SHOW CREATE TABLE, чтобы посмотреть, какой тип MySQL использует фактически. Например, попробуем создать t как таблицу InnoDB, выполнив следующие предложения:

mysql> CREATE TABLE t (i INT) TYPE = InnoDB;
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`i` int(11) default NULL
) TYPE=InnoDB

Если тип InnoDB доступен, то в последней части выражения SHOW будет содержаться TYPE=InnoDB. В противном случае MySQL создаст таблицу, используя тип по умолчанию – MyISAM, тогда последняя часть предложения будет выглядеть как TYPE=MyISAM. (Для проверки типа таблицы также можно применить SHOW TABLE STATUS.)

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

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

• Если вы пишете новое приложение, то можете сразу создать таблицы как таблицы транзакционного типа. Для этого нужно только добавить TYPE = тип_таблицы в конец предложения CREATE TABLE:

CREATE TABLE t1 (i INT) TYPE = BDB;
CREATE TABLE t2 (i INT) TYPE = INNODB;

• Если вы изменяете существующее приложение так, что появляется необходимость в применении транзакций для уже имеющихся таблиц, которые изначально не предназначались для транзакций, можно изменить тип таких таблиц. Например, типы ISAM и MyISAM относятся к нетранзакционным. Попытка использовать их для транзакций приведет к выводу некорректных результатов, так как таблицы не поддерживают операцию отката. Можно применить предложение ALTER TABLE для преобразования таблицы к транзакционному типу. Предположим, что t – это таблица MyISAM. Чтобы преобразовать ее к типу InnoDB, выполните:

ALTER TABLE t TYPE = INNODB;

Имейте в виду, что изменение типа таблицы для поддержки транзакций может изменить и другие аспекты ее поведения. Например, таблицы MyISAM обеспечивают более гибкую обработку столбцов AUTO_INCREMENT, чем другие типы. Если вы используете возможности последовательнос-тей, доступные только для MyISAM, то изменение типа таблицы может создать проблемы.

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

Статьи по MySQL на эту тему:

Альтернативы транзакциям
Выполнение транзакций в программах
Выполнение транзакций средствами SQL
Использование транзакций в программах на Java
Использование транзакций в программах на Perl

Вернуться в раздел: MySQL / 15. Выполнение транзакций