Spec-Zone.ru › MySQL 5.7

14.7.2.2 автосброс, фиксация и откат

В InnoDB вся пользовательская активность происходит внутри транзакции. Если режим autocommit включён, каждое SQL-предложение образует отдельную транзакцию. По умолчанию MySQL запускает сеанс для каждого нового подключения с autocommit включённым, поэтому MySQL выполняет фиксацию после каждого SQL-предложения, если это предложение не вернуло ошибку. Если предложение возвращает ошибку, поведение фиксации или отката зависит от ошибки. См. Раздел 14.22.4, «Обработка ошибок InnoDB».

Сеанс, в котором включён autocommit, может выполнить многострочную транзакцию, начав её явным START TRANSACTION или BEGIN оператором и завершив его COMMIT или ROLLBACK оператором. См. Раздел 13.3.1, «Операторы START TRANSACTION, COMMIT и ROLLBACK».

Если режим autocommit отключён в сеансе с SET autocommit = 0, в сеансе всегда открыта транзакция. Оператор COMMIT или ROLLBACK завершает текущую транзакцию и начинается новая.

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

Некоторые операторы неявно завершают транзакцию, как будто вы выполнили COMMIT перед выполнением оператора. Подробности см. в Разделе 13.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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-autocommit-commit-rollback.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API