文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  autocommit、提交和回滚

17.7.2.2 autocommit、提交和回滚

InnoDB 中,所有用户活动都在事务中进行。如果 autocommit 模式启用,则每个 SQL 语句本身就是一个单独的事务。默认情况下,MySQL 为每个新连接启动的会话都启用了 autocommit,因此如果语句没有返回错误,MySQL 会在每个 SQL 语句之后执行提交。如果语句返回错误,则提交或回滚行为取决于错误。有关详细信息,请参阅 第 17.20.5 节“InnoDB 错误处理”.

启用了 autocommit 的会话可以通过显式 START TRANSACTIONBEGIN 语句启动多语句事务,并通过 COMMITROLLBACK 语句结束事务。有关详细信息,请参阅 第 15.3.1 节“START TRANSACTION、COMMIT 和 ROLLBACK 语句”.

如果在会话中使用 SET autocommit = 0 禁用 autocommit 模式,则会话始终保持打开事务。 COMMITROLLBACK 语句会结束当前事务,并启动一个新事务。

如果在禁用 autocommit 的会话中,没有显式提交最终事务,则 MySQL 会回滚该事务。

某些语句会隐式结束事务,就好像在执行该语句之前执行了 COMMIT 一样。有关详细信息,请参阅 第 15.3.3 节“导致隐式提交的语句”.

COMMIT 表示在当前事务中进行的更改已永久保存,并对其他会话可见。另一方面,ROLLBACK 语句会取消当前事务所做的所有修改。 COMMITROLLBACK 都将释放当前事务期间设置的所有 InnoDB 锁。

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

默认情况下,与 MySQL 服务器的连接以启用 autocommit 模式启动,该模式会自动提交每个执行的 SQL 语句。如果您有其他数据库系统的使用经验,此操作模式可能不熟悉,因为其他数据库系统通常的做法是发出一个 DML 语句序列,并将其全部提交或回滚。

要使用多语句 事务,请使用 SQL 语句 SET autocommit = 0 关闭自动提交,并在每个事务结束后使用 COMMITROLLBACK(视情况而定)。要保持自动提交,请在每个事务开始时使用 START TRANSACTION,并在事务结束时使用 COMMITROLLBACK。以下示例展示了两个事务。第一个事务已提交;第二个事务已回滚。

$> 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 中,您可以像发送其他 SQL 语句(如 SELECTINSERT)一样,将事务控制语句(如 COMMIT)以字符串的形式发送到 MySQL 服务器。一些 API 还提供单独的特殊事务提交和回滚函数或方法。