自动提交
在InnoDB中,所有来自用户的活动都发生在指定用户的事务中,如果autocommit自动提交事务的模式打开,每个SQL语句都形成一个SQL自身的单一事务。默认地,MySQL为每个连接启动一个新的自动提交事务的会话,对会话中的每个SQL语句提交一次事务,如果执行SQL语句的过程中发生异常,则根据异常类型执行回滚操作,如何执行回滚操作的场景分类如下所示,有时候InnoDB只回滚失败的SQL语句,有时候回滚整个事务内的SQL语句:
|
显式地使用START TRANSACTION或者BEGIN语句开始一个事务支持多个语句的功能,以COMMIT或者ROLLBACK语句结束事务。
设置autocommit属性等于0是关闭自动提交事务的功能,此时,会话中总是开启着一个事务,使用COMMIT或者ROLLBACK语句结束当前的事务同时也开启一个新的事务。
如果一个自动提交事务功能关闭的会话,在没有显式地提交最后事务的情况下结束,则MySQL默认地回滚对应的事务。
提交
如前面所述,InnoDB使用COMMIT显式地提交事务,InnoDB存在很多隐式地提交事务的语句,如下所示:
数据定义语言 ALTER EVENT, ALTER FUNCTION, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER TABLESPACE, ALTER VIEW, CREATE DATABASE, CREATE EVENT, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE ROLE, CREATE SERVER, CREATE SPATIAL REFERENCE SYSTEM, CREATE TABLE, CREATE TABLESPACE, CREATE TRIGGER, CREATE VIEW, DROP DATABASE, DROP EVENT, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP ROLE, DROP SERVER, DROP SPATIAL REFERENCE SYSTEM, DROP TABLE, DROP TABLESPACE, DROP TRIGGER, DROP VIEW, INSTALL PLUGIN, RENAME TABLE, TRUNCATE TABLE, UNINSTALL PLUGIN. |
修改数据表 ALTER USER, CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD |
事务控制与锁语句 BEGIN, LOCK TABLES, SET autocommit = 1, START TRANSACTION, UNLOCK TABLES. UNLOCK TABLES |
数据加载语句 LOAD DATA. LOAD DATA |
管理语句 ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH, LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE, RESET |
复制控制语句 START REPLICA, STOP REPLICA, RESET REPLICA, CHANGE REPLICATION SOURCE TO, CHANGE MASTER TO |
回滚
回滚语句是取消当前事务做出的修改,COMMIT事务提交语句与ROLLBACK语句释放所有当前事务中设置的锁。
分组事务操作
如前面所述,当AUTOCOMMIT自动提交事务的功能开启,则MySQL自动地为每个SQL语句生成一个新的事务,并提交每个SQL语句的事务。如下所示,在不同的事务提交方式的情况下,如何在一个事务中执行多个SQL语句: