The world's most popular open source database
The statements listed in this section (and any synonyms for them)
implicitly end a transaction, as if you had done a
COMMIT before executing the
statement. As of MySQL 6.0.8, most of these statements also cause
an implicit commit after executing; for additional details, see
the end of this section.
Data definition language (DDL)
statements that define or modify database objects.
ALTER DATABASE ... UPGRADE DATA DIRECTORY
NAME, ALTER EVENT,
ALTER FUNCTION,
ALTER PROCEDURE,
ALTER TABLE,
ALTER VIEW,
CREATE DATABASE,
CREATE EVENT,
CREATE FUNCTION,
CREATE INDEX,
CREATE PROCEDURE,
CREATE TABLE,
CREATE TRIGGER,
CREATE VIEW,
DROP DATABASE,
DROP EVENT,
DROP FUNCTION (for stored
functions, not UDFs), DROP
INDEX, DROP
PROCEDURE, DROP
TABLE, DROP TRIGGER,
DROP VIEW,
RENAME TABLE,
TRUNCATE
TABLE.
ALTER TABLE,
CREATE TABLE, and
DROP TABLE do not commit a
transaction if the TEMPORARY keyword is
used. (This does not apply to other operations on temporary
tables such as CREATE INDEX,
which do cause a commit.) However, although no implicit commit
occurs, neither can the statement be rolled back. Therefore,
use of such statements will violate transaction atomicity: For
example, if you use CREATE TEMPORARY TABLE
and then roll back the transaction, the table remains in
existence.
The CREATE TABLE statement in
InnoDB is processed as a single
transaction. This means that a
ROLLBACK
from the user does not undo CREATE
TABLE statements the user made during that
transaction.
CREATE TABLE ... SELECT causes an implicit
commit before and after the statement is executed when you are
creating non-temporary tables. (No commit occurs for
CREATE TEMPORARY TABLE ... SELECT.) This is
to prevent an issue during replication where the table could
be created on the master after a rollback, but fail to be
recorded in the binary log, and therefore not replicated to
the slave. For more information, see Bug#22865.
Statements that implicitly use or modify
tables in the mysql database.
CREATE USER,
DROP USER,
RENAME USER.
Beginning with MySQL 6.0.3,
GRANT and
REVOKE statements cause an
implicit commit. Beginning with MySQL 6.0.4,
SET PASSWORD statements cause
an implicit commit.
Transaction-control and locking
statements.
BEGIN,
LOCK TABLES, SET
autocommit = 1 (if the value is not already 1),
START
TRANSACTION,
UNLOCK
TABLES.
UNLOCK
TABLES commits a transaction only if any tables
currently have been locked with LOCK
TABLES to acquire non-transactional table locks. A
commit does not occur for
UNLOCK
TABLES following
FLUSH TABLES WITH READ
LOCK because the latter statement does not acquire
table-level locks.
Transactions cannot be nested. This is a consequence of the
implicit commit performed for any current transaction when you
issue a START
TRANSACTION statement or one of its synonyms.
Statements that cause an implicit commit cannot be used in an
XA transaction while the transaction is in an
ACTIVE state.
The BEGIN
statement differs from the use of the BEGIN
keyword that starts a BEGIN ... END
compound statement. The latter does not cause an implicit
commit. See Section 12.8.1, “BEGIN ... END Compound Statement Syntax”.
Data loading statements.
LOAD DATA
INFILE (for NDB only; see
Bug#11151).
Administrative statements.
ANALYZE TABLE,
BACKUP DATABASE,
CACHE INDEX,
CHECK TABLE,
LOAD INDEX INTO
CACHE, OPTIMIZE
TABLE, REPAIR TABLE,
RESTORE.
As of MySQL 6.0.8, most statements that previously caused an implicit commit before executing also do so after executing. The intent is to handle each such statement in its own special transaction because it cannot be rolled back anyway. The following list provides additional details pertaining to this change:
The CREATE TABLE variants
(CREATE TABLE for
InnoDB tables and CREATE TABLE ...
SELECT) that previously were special cases no longer
are so because CREATE TABLE
uniformly causes an implicit commit before and after
executing.
The FLUSH statement causes an
implicit commit.
Transaction-control and locking statements behave as before.


User Comments
Add your own comment.