Выполнение транзакций средствами SQL

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

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

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

Обычно MySQL работает в режиме автофиксации, то есть результат каждого предложения фиксируется сразу после его выполнения. (Фактически, каждое предложение – это транзакция.) Чтобы выполнить транзакцию, состоящую из нескольких предложений, необходимо отключить режим автофиксации, выдать предложения, составляющие транзакцию, затем или принять или откатить сделанные изменения.


В MySQL есть два способа сделать это:

• Создайте предложение BEGIN (или BEGIN WORK) для временного отключения режима автофиксации, затем запустите запросы, входящие в транзакцию, запишите результат в базу данных и завершите транзакцию, выполнив предложение COMMIT:

mysql> CREATE TABLE t (i INT) TYPE = InnoDB;
mysql> BEGIN;
mysql> INSERT INTO t (i) VALUES(1);mysql> INSERT INTO t (i) VALUES(2);
mysql> COMMIT;
mysql> SELECT * FROM t;

+------+
| i |
+------+
| 1 |
| 2 |
+------+

В случае ошибки не используйте COMMIT. Отменить транзакцию можно, выполнив предложение ROLLBACK. В следующем примере таблица t остается пустой после выполнения транзакции, так как предложения INSERT откатываются:

mysql> CREATE TABLE t (i INT) TYPE = InnoDB;
mysql> BEGIN;
mysql> INSERT INTO t (i) VALUES(1);
mysql> INSERT INTO t (x) VALUES(2);
ERROR 1054 at line 5: Unknown column 'x' in 'field list'
mysql> ROLLBACK;
mysql> SELECT * FROM t;
Empty set (0.00 sec)

• Другой способ группировки предложений – явное отключение режима автофиксации.


Тогда каждое выдаваемое предложение становится частью текущей транзакции. Чтобы завершить транзакцию и начать следующую, выполните предложение COMMIT или ROLLBACK:

mysql> CREATE TABLE t (i INT) TYPE = InnoDB;
mysql> SET AUTOCOMMIT = 0;
mysql> INSERT INTO t (i) VALUES(1);
mysql> INSERT INTO t (i) VALUES(2);
mysql> COMMIT;
mysql> SELECT * FROM t;

+------+
| i |
+------+
| 1 |
| 2 |
+------+

Для возврата в режим автофиксации выполните такую команду:

mysql> SET AUTOCOMMIT = 1;

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Альтернативы транзакциям
Выполнение транзакций в программах
Использование транзакций в программах на Java
Использование транзакций в программах на Perl
Использование транзакций в программах на PHP

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