14.7.2.2 自动提交,提交和回滚

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

启用了autocommit的会话可以通过以显式START TRANSACTIONBEGIN语句开始并以COMMITROLLBACK语句结束来执行多语句事务。参见第 13.3.1 节“ START TRANSACTION,COMMIT 和 ROLLBACK 语句”

如果在与SET autocommit = 0的会话中禁用了autocommit模式,则该会话始终具有打开的事务。 COMMITROLLBACK语句结束当前事务,然后开始新的事务。

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

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

COMMITtable 示在当前事务中所做的更改将成为永久性的,并在其他会话中可见。另一方面,ROLLBACK语句会取消当前事务所做的所有修改。 COMMITROLLBACK都释放在当前事务期间设置的所有InnoDB锁。

将 DML 操作与事务分组

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

要使用多语句transactions,请关闭 SQL 语句SET autocommit = 0的自动提交,并在适当时以COMMITROLLBACK结束每个事务。要保留自动提交功能,请以START TRANSACTION开始每个事务,并以COMMITROLLBACK结束它。以下示例显示了两个事务。首先是承诺;第二个被回滚。

shell> 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>
Client 端语言的 Transaction

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