17.7.2.2 Режим автоматического подтверждения, подтверждение и откат
В InnoDB вся активность пользователя происходит внутри транзакции. Если режим autocommit включен, каждое SQL-выражение образует отдельную транзакцию. По умолчанию MySQL запускает сеанс для каждого нового подключения с autocommit включенным, поэтому MySQL производит подтверждение после каждого SQL-выражения, если оно не вернуло ошибку. Если выражение возвращает ошибку, поведение подтверждения или отката зависит от ошибки. См. Раздел 17.20.5 «Обработка ошибок InnoDB».
Сеанс, у которого включен autocommit, может выполнить транзакцию из нескольких выражений, начав её явным START
TRANSACTION или BEGIN выражением и завершив его COMMIT или ROLLBACK выражением. См. Раздел 15.3.1 «Выражения START TRANSACTION, COMMIT и ROLLBACK».
Если режим autocommit отключён в сеансе с SET autocommit = 0, у сеанса всегда открыта транзакция. COMMIT или ROLLBACK выражение завершает текущую транзакцию и запускает новую.
Если сеанс, у которого autocommit отключен, завершается без явного подтверждения финальной транзакции, MySQL откатывает эту транзакцию.
Некоторые выражения неявно завершают транзакцию, как если бы вы выполнили COMMIT перед выполнением выражения. Подробности см. в Разделе 15.3.3 «Выражения, вызывающие неявное подтверждение».
COMMIT означает, что изменения, внесённые в текущую транзакцию, становятся постоянными и видимыми для других сеансов. ROLLBACK выражение, с другой стороны, отменяет все изменения, внесённые текущей транзакцией. Оба COMMIT и ROLLBACK освобождают все InnoDB блокировки, установленные во время текущей транзакции.
Группировка операций DML с помощью транзакций
По умолчанию подключение к серверу MySQL начинается с включенным режимом, который автоматически подтверждает каждое SQL-выражение по мере его выполнения. Этот режим работы может быть непривычным, если у вас есть опыт работы с другими системами баз данных, где стандартной практикой является отправка последовательности выражений и их подтверждение или откат вместе.
Чтобы использовать многострочные транзакции, отключите автоподтверждение с помощью SQL-выражения SET autocommit
= 0 и завершите каждую транзакцию с помощью COMMIT или ROLLBACK соответственно. Чтобы оставить автоподтверждение включенным, начните каждую транзакцию с START
TRANSACTION и завершите её с помощью COMMIT или ROLLBACK. Следующий пример показывает две транзакции. Первая подтверждается, вторая откатывается.
$> mysql test
mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
Query OK, 0 rows affected (0.00 sec)
mysql> -- Do a transaction with autocommit turned on.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO customer VALUES (10, 'Heikki');
Query OK, 1 row affected (0.00 sec)
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
mysql> -- Do another transaction with autocommit turned off.
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO customer VALUES (15, 'John');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO customer VALUES (20, 'Paul');
Query OK, 1 row affected (0.00 sec)
mysql> DELETE FROM customer WHERE b = 'Heikki';
Query OK, 1 row affected (0.00 sec)
mysql> -- Now we undo those last 2 inserts and the delete.
mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM customer;
+------+--------+
| a | b |
+------+--------+
| 10 | Heikki |
+------+--------+
1 row in set (0.00 sec)
mysql>
Транзакции в языках клиентской стороны
В API, таких как PHP, Perl DBI, JDBC, ODBC или стандартном C-интерфейсе вызова MySQL, вы можете отправлять выражения управления транзакциями, такие как COMMIT, на сервер MySQL в виде строк, как и любые другие SQL-выражения, такие как SELECT или INSERT. Некоторые API также предлагают отдельные специальные функции или методы подтверждения и отката транзакций.
© 2025 Oracle
Licensed under the GPLv2 License.