自动提交,提交和回滚(START TRANSACTION、COMMIT、 ROLLBACK)
在中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
在执行该语句之前已经完成了。有关详细信息,请参见“START TRANSACTION,COMMIT和ROLLBACK语句”。
这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 customerVALUES (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 customerVALUES (15, 'John'); Query OK, 1 row affected (0.00 sec) mysql>INSERT INTO customerVALUES (20, 'Paul'); Query OK, 1 row affected (0.00 sec) mysql>DELETE FROM customerWHERE 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还提供了单独的特殊事务提交和回滚功能或方法。