15.3.3 导致隐式提交的语句
本节中列出的语句(及其同义语句)在当前会话中结束任何活动事务,就像你执行了COMMIT
一样。
这些语句的大多数还会在执行后隐式提交。目的是将每个这样的语句处理在其自己的特殊事务中。事务控制和锁定语句是例外:如果在执行前发生隐式提交,执行后不会再次发生。
-
数据库对象定义或修改语言(DDL)语句。
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
.CREATE TABLE
和DROP TABLE
语句不会在使用TEMPORARY
关键字时提交事务。(这不适用于其他临时表的操作,如ALTER TABLE
和CREATE INDEX
,这些语句会导致提交。)然而,虽然没有隐式提交,但也不能回滚语句,这意味着使用这些语句会违反事务原子性。例如,如果你使用CREATE TEMPORARY TABLE
,然后回滚事务,表仍然存在。在
InnoDB
中,CREATE TABLE
语句被处理为单个事务。这意味着用户的ROLLBACK
操作不会撤销用户在该事务中执行的CREATE TABLE
语句。CREATE TABLE ... SELECT
在创建非临时表时,会隐式地在执行语句前和后进行 commit 操作。(对于CREATE TEMPORARY TABLE ... SELECT
不会发生 commit。) -
使用或修改
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
只有在当前已经锁定了表以获取非事务表锁时,才会提交事务。对UNLOCK TABLES
语句进行的提交不适用于FLUSH TABLES WITH READ LOCK
,因为后者语句不获取表级锁。事务不能嵌套。这是隐式提交当前事务的结果,当您发出
START TRANSACTION
语句或其同义之一时。在 XA 事务中,事务处于
ACTIVE
状态时,不能使用隐式提交的事务语句。BEGIN
语句与开始一个BEGIN ... END
复合语句的BEGIN
关键字不同。后者不导致隐式提交。请参阅第15.6.1节,“BEGIN ... END复合语句”。 -
管理语句。
ANALYZE TABLE
、CACHE INDEX
、CHECK TABLE
、FLUSH
、LOAD INDEX INTO CACHE
、OPTIMIZE TABLE
、REPAIR TABLE
、RESET
(但不是RESET PERSIST
). -
复制控制语句。
START REPLICA
、STOP REPLICA
、RESET REPLICA
、CHANGE REPLICATION SOURCE TO
.