13.3.3_会导致隐式提交的语句

原文链接

本章节所列出的语句(或是它们的同义词)会导致当前session中的事务隐式地结束,就像在执行该语句前调用过 COMMIT 一样。

它们中的大多数还会在执行过后隐式地进行COMMIT,目的是为了能在各自语句的事务内完成处理。事务控制和锁语句例外;如果在执行前隐式地执行了COMMIT,在执行结束就不会再次执行了

  • 定义或修改数据库对象的数据定义语句(DDL)ALTER EVENT, ALTER FUNCTION, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER VIEW, CREATE DATABASE, CREATE EVENT, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE ROLE, CREATE SERVER, CREATE SPATIAL REFERENCE SYSTEM, CREATE TABLE, 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 TRIGGER, DROP VIEW, INSTALL PLUGIN, RENAME TABLE, TRUNCATE TABLE, UNINSTALL PLUGIN.

    如果使用了 TEMPORARY关键字,CREATE TABLEDROP TABLE 语句将不会再提交事务(没有在临时表中应用例如 ALTER TABLECREATE INDEX等会导致事务提交的操作),然而即使没有隐式提交,这些语句也是不能被回滚的,这就意味着使用这些语句将导致事务的原子性被破坏,例如,使用CREATE TEMPORARY TABLE 然后回滚这个事务,创建出来的表仍旧存在。

    CREATE TABLE 在InnoDB作为一个单独的事务来进行处理。这意味着ROLLBACK 无法撤销当前事务中的CREATE TABLE所做的操作。

    CREATE TABLE ... SELECT分别在执行创建非临时表前和后隐式地进行COMMIT(CREATE TEMPORARY TABLE ... SELECT 不会有提交操作)

  • 在mysql数据库中隐式地使用或修改表 ALTER USER, CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD.

  • 事务控制和锁语句 BEGIN, LOCK TABLES, SET autocommit = 1 (如果当前值不是1), START TRANSACTION, UNLOCK TABLES.

    UNLOCK TABLES仅当表使用 LOCK TABLES 获取无事务表锁时才会提交事务,在 FLUSH TABLES WITH READ LOCK 后的 UNLOCK TABLES 不会有事务提交,因为它不会获取表锁。

    事务不会被嵌套,在任意事务使用 START TRANSCACTION 或它的同义词时,会导致当前事务被隐式提交。

    当XA事务是 ACTIVE 状态时,那些导致事务隐式提交的语句不能被使用

    BEGIN 和符合语句 BEGIN ... END 中的BEGIN关键字是不同的,后者不会导致隐式提交 参见Section 13.6.1, “BEGIN … END Compound-Statement Syntax”.

  • 数据加载语句 LOAD DATA INFILE. LOAD DATA INFILE 仅当数据表使用 NDB 引擎时会导致隐式提交

  • 管理语句 ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH, LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE, RESET(但REST PERSIST不是)

  • 复制控制语句 START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER TO.

文章链接 https://fangzongzhou.github.io/2018/08/24/计算机/技术文档/MYSQL/13-3-3-会导致隐式提交的语句/