在 InnoDB
中,所有用户活动都在事务中进行。如果 autocommit
模式启用,则每个 SQL 语句本身就是一个单独的事务。默认情况下,MySQL 为每个新连接启动的会话都启用了 autocommit
,因此如果语句没有返回错误,MySQL 会在每个 SQL 语句之后执行提交。如果语句返回错误,则提交或回滚行为取决于错误。有关详细信息,请参阅 第 17.20.5 节“InnoDB 错误处理”.
启用了 autocommit
的会话可以通过显式 START TRANSACTION
或 BEGIN
语句启动多语句事务,并通过 COMMIT
或 ROLLBACK
语句结束事务。有关详细信息,请参阅 第 15.3.1 节“START TRANSACTION、COMMIT 和 ROLLBACK 语句”.
如果在会话中使用 SET autocommit = 0
禁用 autocommit
模式,则会话始终保持打开事务。 COMMIT
或 ROLLBACK
语句会结束当前事务,并启动一个新事务。
如果在禁用 autocommit
的会话中,没有显式提交最终事务,则 MySQL 会回滚该事务。
某些语句会隐式结束事务,就好像在执行该语句之前执行了 COMMIT
一样。有关详细信息,请参阅 第 15.3.3 节“导致隐式提交的语句”.
COMMIT
表示在当前事务中进行的更改已永久保存,并对其他会话可见。另一方面,ROLLBACK
语句会取消当前事务所做的所有修改。 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>
客户端语言中的事务
在 PHP、Perl DBI、JDBC、ODBC 或 MySQL 的标准 C 调用接口等 API 中,您可以像发送其他 SQL 语句(如 SELECT
或 INSERT
)一样,将事务控制语句(如 COMMIT
)以字符串的形式发送到 MySQL 服务器。一些 API 还提供单独的特殊事务提交和回滚函数或方法。