当我们使用 START TRANSACTION 或者 BEGIN 语句开启了一个事务,或者把 系统变量 autocommit 的值设置为 OFF 时,事务就不会进行自动提交,但是如果 我们输入了某些语句之后就会悄悄的提交掉,就像我们输入了 COMMIT 语句了 一样,这种因为某些特殊的语句而导致事务提交的情况称为隐式提交,这些会导 致事务隐式提交的语句包括:

执行 DDL

定义或修改数据库对象的数据定义语言(Data definition language,缩写为: DDL)。所谓的数据库对象,指的就是数据库、表、视图、存储过程等等这些东西。 当我们使用 CREATE、ALTER、DROP 等语句去修改这些所谓的数据库对象时,就 会隐式的提交前边语句所属于的事务,就像这样:
BEGIN;
SELECT … # 事务中的一条语句
UPDATE … # 事务中的一条语句
… # 事务中的其它语句CREATE TABLE … # 此语句会隐式的提交前边语句所属于的事务

隐式使用或修改 mysql 数据库中的表

当我们使用 ALTER USER、CREATE USER、DROP USER、GRANT、RENAME USER、 REVOKE、SET PASSWORD 等语句时也会隐式的提交前边语句所属于的事务。

事务控制或关于锁定的语句

当我们在一个会话里,一个事务还没提交或者回滚时就又使用 START TRANSACTION 或者 BEGIN 语句开启了另一个事务时,会隐式的提交上一个事务,
比如这样:
BEGIN;
SELECT … # 事务中的一条语句
UPDATE … # 事务中的一条语句
… # 事务中的其它语句
BEGIN; # 此语句会隐式的提交前边语句所属于的事务
或者当前的 autocommit 系统变量的值为 OFF,我们手动把它调为 ON 时, 也会隐式的提交前边语句所属的事务。
或者使用 LOCK TABLES、UNLOCK TABLES 等关于锁定的语句也会隐式的提交 前边语句所属的事务。

加载数据的语句

比如我们使用 LOAD DATA 语句来批量往数据库中导入数据时,也会隐式的提交前边语句所属的事务。

关于 MySQL 复制的一些语句

使用 START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO 等语句时也会隐式的提交前边语句所属的事务。

其它的一些语句

使用 ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET 等语句也会隐式的提交前边语句所属的事务。