13.3.3 导致隐式提交的语句

本节中列出的语句(及其任何同义词)隐式结束当前会话中任何活动的事务,就好像您在执行该语句之前完成了COMMIT一样。

这些语句大多数还会在执行后导致隐式提交。目的是在自己的特殊事务中处理每个这样的语句,因为它无论如何都不能回滚。事务控制和锁定语句是 exception:如果隐式提交发生在执行之前,则另一个不会发生。

ALTER FUNCTIONCREATE FUNCTIONDROP FUNCTION与存储函数一起使用时,也会引起隐式提交,但与用户定义的函数一起使用时,会导致隐式提交。 (ALTER FUNCTION只能与存储的函数一起使用。)

如果使用TEMPORARY关键字,则CREATE TABLEDROP TABLE语句不提交事务。 (这不适用于确实导致提交的临时 table,例如ALTER TABLECREATE INDEX上的其他操作。)但是,尽管没有隐式提交发生,但是语句也不能回滚,这意味着使用此类语句会导致事务性违反原子性。例如,如果您使用创建临时 table然后回滚该事务,则该 table 仍然存在。

InnoDB中的CREATE TABLE语句作为单个事务处理。这意味着来自用户的ROLLBACK不会撤消用户在该 Transaction 期间做出的CREATE TABLE语句。

创建非临时 table 时,创建 table...选择会在执行语句之前和之后导致隐式提交。 (CREATE TEMPORARY TABLE ... SELECT没有提交.)

仅当当前已使用LOCK TABLES锁定任何 table 以获取非事务性 table 锁时,UNLOCK TABLES才会提交事务。 带读取锁的平桌子之后的UNLOCK TABLES不会发生提交,因为后者的语句不获取 table 级锁。

事务不能嵌套。这是您发出START TRANSACTION语句或其同义词之一时对任何当前事务执行的隐式提交的结果。

当事务处于ACTIVE状态时,不能在 XA 事务中使用导致隐式提交的语句。

BEGIN语句不同于使用BEGIN关键字来启动开始...结束复合语句。后者不会导致隐式提交。参见第 13.6.1 节“ BEGIN ... END 复合语句”