在 InnoDB
中,所有用户活动都发生在事务中。如果 autocommit
模式启用,每个 SQL 语句形成一个单独的事务。默认情况下,MySQL 在每个新连接时启动会话,以 autocommit
模式启用,因此 MySQL 在每个 SQL 语句执行后提交,如果该语句未返回错误。如果语句返回错误,提交或回滚行为取决于错误。请参阅 第 17.20.5 节,“InnoDB 错误处理”。
启用 autocommit
模式的会话可以通过启动事务来执行多语句事务,使用明确的 START TRANSACTION
或 BEGIN
语句,并以 COMMIT
或 ROLLBACK
语句结束。请参阅 第 15.3.1 节,“START TRANSACTION, COMMIT, and ROLLBACK Statements”。
如果在会话中禁用 autocommit
模式,使用 SET autocommit = 0
,则会话总是打开事务。 COMMIT
或 ROLLBACK
语句结束当前事务,并启动新的事务。
如果禁用 autocommit
模式的会话在未明确提交最终事务的情况下结束,MySQL 将回滚该事务。
一些语句隐式结束事务,就像您执行了 COMMIT
语句之前。有关详细信息,请参阅 第 15.3.3 节,“Statements That Cause an Implicit Commit”。
COMMIT
表示当前事务中的更改被永久保存并对其他会话可见。ROLLBACK
语句则取消当前事务中的所有修改。两者都释放了 InnoDB
在当前事务中设置的锁。
默认情况下,连接到 MySQL 服务器时启用 autocommit 模式,这将自动提交每个 SQL 语句。如果您来自其他数据库系统,您可能习惯于发出一系列 DML 语句,然后一起提交或回滚它们。
要使用多语句事务,请使用 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>
Transactions in Client-Side Languages
在 PHP、Perl DBI、JDBC、ODBC 或 MySQL 的标准 C 调用接口等 API 中,您可以将事务控制语句,如 COMMIT
,作为字符串发送到 MySQL 服务器,就像发送其他 SQL 语句,如 SELECT
或 INSERT
。一些 API 也提供了单独的特殊事务提交和回滚函数或方法。