Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.7.2.2 自动提交、提交和回滚

InnoDB中,所有用户活动都发生在事务中。如果启用了autocommit模式,每个SQL语句都会形成单独的事务。默认情况下,MySQL为每个新连接启动会话,并启用autocommit,因此 MySQL 会在语句执行完毕后 commit,如果语句没有返回错误。如果语句返回错误,则提交或回滚行为取决于错误。请参阅第17.20.5节,“InnoDB Error Handling”

启用了autocommit的会话可以执行多语句事务,通过使用明确的START TRANSACTIONBEGIN语句开始,并使用COMMITROLLBACK语句结束。请参阅第15.3.1节,“START TRANSACTION, COMMIT, and ROLLBACK Statements”

如果在会话中禁用autocommit模式,使用SET autocommit = 0,那么该会话总是保持一个事务打开。一个COMMITROLLBACK语句结束当前事务,并开始一个新的。

如果禁用autocommit的会话在没有明确提交最后的事务的情况下结束,MySQL将回滚该事务。

一些语句隐式地结束事务,就像你执行了COMMIT语句一样。详细信息请见第15.3.3节,“隐式提交语句”

一个COMMIT语句意味着当前事务中的更改将被永久保存,并对其他会话变得可见。另一方面,一个ROLLBACK语句取消当前事务中的所有修改。同时,COMMITROLLBACK都释放了在当前事务中设置的所有InnoDB锁。

默认情况下,连接到 MySQL 服务器时将启用自动提交模式,这样每执行一个 SQL 语句都会自动提交。这种操作方式可能会让您感到陌生,如果您有其他数据库系统的经验,那么您可能习惯于执行一系列数据 manipulation语言语句,然后一起提交或回滚它们。

要使用多语句事务,使用 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>
Transactions in Client-Side Languages

在APIs,如PHP、Perl DBI、JDBC、ODBC或MySQL的标准C调用接口,您可以将事务控制语句,如COMMIT发送到MySQL服务器,就像任何其他SQL语句一样,如SELECTINSERT。一些API还提供了单独的特殊事务提交和回滚函数或方法。