MySQL官方文档14.5.2.2 自动提交、提交和回滚

原文地址:https://dev.mysql.com/doc/refman/5.7/en/innodb-autocommit-commit-rollback.html

14.5.2.2自动提交、提交和回滚

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

启用自动提交的会话可以通过以明确的START TRANSACTION或BEGIN语句启动并使用COMMIT或ROLLBACK语句结束它来执行多语句事务。请参见第13.3.1节“START TRANSACTION,COMMIT和ROLLBACK语法”。

如果在SET autocommit = 0的会话中禁用自动提交模式,则会话始终打开一个事务。COMMIT或ROLLBACK语句结束当前事务并开始一个新事务。

如果具有禁用自动提交功能的会话在未显式提交最终事务的情况下结束,则MySQL会回滚该事务。

COMMIT意味着在当前事务中所做的更改将永久化并对其他会话可见。另一方面,ROLLBACK语句会取消当前事务所做的所有修改。COMMIT和ROLLBACK都释放当前事务期间设置的所有InnoDB锁。

用事务对DML操作进行分组

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

要使用多语句事务,请使用SQL语句SET autocommit = 0关闭自动提交,并根据需要使用COMMIT或ROLLBACK结束每个事务。要开启自动提交,请使用START TRANSACTION开始每个事务并使用COMMIT或ROLLBACK结束它。以下示例显示了两个事务。第一个提交; 第二个回滚。

shell> mysql test
mysql> CREATE TABLE customer (a INT, b CHAR (20), INDEX (a));
Query OK, 0 rows affected (0.00 sec)
mysql> -- 开启自动提交的事务。
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> -- 关闭自动提交开启另一个事务。
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> -- 现在我们取消最后2个插入和删除。
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还提供单独的特殊事务提交和回滚函数或方法。

猜你喜欢

转载自blog.csdn.net/heroqiang/article/details/80613675
今日推荐