自动提交,提交和回滚
在中InnoDB
,所有用户活动都发生在交易内部。如果autocommit
启用了mode,则每个SQL语句将自己形成一个事务。默认情况下,MySQL为autocommit
启用的每个新连接启动会话,因此如果该SQL语句未返回错误,则MySQL在每个SQL语句之后进行提交。如果一条语句返回错误,则提交或回滚行为取决于该错误。请参见 “ InnoDB错误处理”。
具有会话autocommit
启用可以通过显式启动它执行多语句事务 START TRANSACTION
或 BEGIN
语句,并用它结束 COMMIT
或 ROLLBACK
声明。请参见“ START TRANSACTION,COMMIT和ROLLBACK语句”。
如果autocommit
在与SET autocommit = 0
的会话中禁用了mode ,则该会话将始终打开一个事务。一个 COMMIT
或 ROLLBACK
语句结束当前事务和一个新的开始。
如果autocommit
禁用的会话在 没有显式提交最终事务的情况下结束,则MySQL将回滚该事务。
某些语句隐式结束事务,就好像您COMMIT
在执行该语句之前已经完成了。有关详细信息,请参见“导致隐式提交的声明”。
这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> -- 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中,您可以COMMIT
像其他任何SQL语句(如SELECT
或) 一样,将事务控制语句(如字符串)发送到MySQL服务器INSERT
。一些API还提供了单独的特殊事务提交和回滚功能或方法。
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。