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.