17.7.2.2 autocommit, подтверждение и откат
В 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-оператор при его выполнении. Этот режим работы может быть непривычным, если у вас есть опыт работы с другими системами баз данных, где стандартной практикой является выдача последовательности операторов и их одновременное подтверждение или откат.
Чтобы использовать несколько операторов, выключите режим autocommit с помощью SQL-оператора SET autocommit
= 0 и завершите каждую транзакцию операторами COMMIT или ROLLBACK соответственно. Чтобы оставить autocommit включённым, начните каждую транзакцию с 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.