13.3.3 导致隐式提交的语句
本节中列出的语句(及其任何同义词)隐式结束当前会话中任何活动的事务,就好像您在执行该语句之前完成了COMMIT一样。
这些语句大多数还会在执行后导致隐式提交。目的是在自己的特殊事务中处理每个这样的语句,因为它无论如何都不能回滚。事务控制和锁定语句是 exception:如果隐式提交发生在执行之前,则另一个不会发生。
- **定义或修改数据库对象的数据定义语言(DDL)语句DROP INDEX,DROP PROCEDURE,DROP SERVER,DROP TABLE,DROP TRIGGER,DROP VIEW,INSTALL PLUGIN,RENAME TABLE,TRUNCATE TABLE,UNINSTALL PLUGIN。
ALTER FUNCTION,CREATE FUNCTION和DROP FUNCTION与存储函数一起使用时,也会引起隐式提交,但与用户定义的函数一起使用时,会导致隐式提交。 (ALTER FUNCTION只能与存储的函数一起使用。)
如果使用TEMPORARY
关键字,则CREATE TABLE和DROP TABLE语句不提交事务。 (这不适用于确实导致提交的临时 table,例如ALTER TABLE和CREATE INDEX上的其他操作。)但是,尽管没有隐式提交发生,但是语句也不能回滚,这意味着使用此类语句会导致事务性违反原子性。例如,如果您使用创建临时 table然后回滚该事务,则该 table 仍然存在。
InnoDB
中的CREATE TABLE语句作为单个事务处理。这意味着来自用户的ROLLBACK不会撤消用户在该 Transaction 期间做出的CREATE TABLE语句。
创建非临时 table 时,创建 table...选择会在执行语句之前和之后导致隐式提交。 (CREATE TEMPORARY TABLE ... SELECT
没有提交.)
-
隐式使用或修改
mysql
数据库中 table 的语句. ALTER USER,CREATE USER,DROP USER,GRANT,RENAME USER,REVOKE,SET PASSWORD。 -
Transaction 控制和锁定语句. BEGIN,LOCK TABLES,
SET autocommit = 1
(如果该值尚未为 1),START TRANSACTION,UNLOCK TABLES。
仅当当前已使用LOCK TABLES锁定任何 table 以获取非事务性 table 锁时,UNLOCK TABLES才会提交事务。 带读取锁的平桌子之后的UNLOCK TABLES不会发生提交,因为后者的语句不获取 table 级锁。
事务不能嵌套。这是您发出START TRANSACTION语句或其同义词之一时对任何当前事务执行的隐式提交的结果。
当事务处于ACTIVE
状态时,不能在 XA 事务中使用导致隐式提交的语句。
BEGIN语句不同于使用BEGIN
关键字来启动开始...结束复合语句。后者不会导致隐式提交。参见第 13.6.1 节“ BEGIN ... END 复合语句”。