Documentation Home

15.7.2.2 自动提交、提交和回滚

InnoDB中,所有用户活动都发生在事务内。如果autocommit启用模式,则每个 SQL 语句自己形成一个事务。默认情况下,MySQL 为启用的每个新连接启动会话autocommit ,因此如果该语句未返回错误,MySQL 会在每个 SQL 语句之后提交。如果语句返回错误,提交或回滚行为取决于错误。请参阅 第 15.21.5 节,“InnoDB 错误处理”

已启用的会话可以通过以显式或 语句开始并以or 语句结束 autocommit 来执行多语句事务 。请参阅第 13.3.1 节,“START TRANSACTION、COMMIT 和 ROLLBACK 语句”START TRANSACTIONBEGINCOMMITROLLBACK

如果autocommit在与 的会话中禁用模式SET autocommit = 0,则该会话始终有一个打开的事务。COMMITor ROLLBACK 语句结束当前事务并开始新的事务 。

如果 autocommit禁用的会话在未显式提交最终事务的情况下结束,MySQL 将回滚该事务。

一些语句隐式结束事务,就好像您COMMIT在执行该语句之前已经完成了操作一样。有关详细信息,请参阅第 13.3.3 节,“导致隐式提交的语句”

ACOMMIT意味着在当前事务中所做的更改是永久性的,并且对其他会话可见。ROLLBACK 另一方面,语句取消当前事务所做的所有修改。 两者都 COMMIT释放 ROLLBACK 当前InnoDB事务期间设置的所有锁。

使用事务对 DML 操作进行分组

默认情况下,与 MySQL 服务器的连接以启用的 自动提交模式开始,它会在您执行每个 SQL 语句时自动提交它。如果您有使用其他数据库系统的经验,这种操作模式可能不熟悉,在其他数据库系统中,标准做法是发出一系列 DML语句并将它们一起提交或回滚。

要使用多语句 事务,请使用 SQL 语句关闭自动提交,并根据需要使用或 SET autocommit = 0结束每个事务 。要保留自动提交,请以 或 开始每个事务并以 或 结束。以下示例显示了两个事务。第一个是承诺的;第二个被回滚。 COMMITROLLBACKSTART TRANSACTIONCOMMITROLLBACK

$> 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>
客户端语言的交易

在 PHP、Perl DBI、JDBC、ODBC 或 MySQL 的标准 C 调用接口等 API 中,您可以将诸如或 COMMIT之类的任何其他 SQL 语句作为字符串发送到 MySQL 服务器的事务控制语句。一些 API 还提供单独的特殊事务提交和回滚功能或方法。 SELECTINSERT