このセクションに示されているステートメント (およびそのすべてのシノニム) は、ユーザーがこのステートメントを実行する前に COMMIT
を実行したかのように、現在のセッション内でアクティブなすべてのトランザクションを暗黙的に終了します。MySQL 5.5.3 の時点では、これらのステートメントのほとんどが、実行後に暗黙的なコミットも発生させます。詳細は、このセクションの最後を参照してください。
-
データベースオブジェクトを定義または変更するデータ定義言語 (DDL) ステートメント。
ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME
、ALTER EVENT
、ALTER PROCEDURE
、ALTER SERVER
、ALTER TABLE
、ALTER VIEW
、CREATE DATABASE
、CREATE EVENT
、CREATE INDEX
、CREATE PROCEDURE
、CREATE SERVER
、CREATE TABLE
、CREATE TRIGGER
、CREATE VIEW
、DROP DATABASE
、DROP EVENT
、DROP INDEX
、DROP PROCEDURE
、DROP SERVER
、DROP TABLE
、DROP TRIGGER
、DROP VIEW
、RENAME TABLE
、TRUNCATE TABLE
。ALTER FUNCTION
、CREATE FUNCTION
、およびDROP FUNCTION
もまた、ストアドファンクション (ただし、UDF を除く) で使用された場合は暗黙的なコミットを発生させます。(ALTER FUNCTION
は、ストアドファンクションでのみ使用できます。)CREATE TABLE
およびDROP TABLE
ステートメントは、TEMPORARY
キーワードが使用されている場合はトランザクションをコミットしません。(これは、コミットを発生させるALTER TABLE
やCREATE INDEX
などの、一時テーブルに対するその他の操作には適用されません。) ただし、暗黙的なコミットは発生しませんが、ステートメントのロールバックもできません。つまり、このようなステートメントを使用すると、トランザクションのアトミック性が侵害されます。たとえば、CREATE TEMPORARY TABLE
を使用したあとにトランザクションをロールバックしても、そのテーブルは存在し続けます。InnoDB
でのCREATE TABLE
ステートメントは、1 つのトランザクションとして処理されます。つまり、ユーザーがROLLBACK
を発行しても、ユーザーがそのトランザクション中に実行したCREATE TABLE
ステートメントは元に戻されません。CREATE TABLE ... SELECT
は、一時テーブル以外のテーブルを作成している場合、そのステートメントが実行される前後に暗黙的なコミットを発生させます。(CREATE TEMPORARY TABLE ... SELECT
に対してコミットは発生しません。)これは、ロールバック後にマスター上でテーブルを作成できたが、バイナリログへの記録に失敗したため、スレーブにはレプリケートされないというレプリケーション中の問題を回避するために行われます。詳細は、Bug #22865 を参照してください。 mysql
データベース内のテーブルを暗黙的に使用または変更するステートメント。CREATE USER
、DROP USER
、GRANT
、RENAME USER
、REVOKE
、SET PASSWORD
。-
トランザクション制御およびロックステートメント。
BEGIN
、LOCK TABLES
、SET autocommit = 1
(この値がまだ 1 でない場合)、START TRANSACTION
、UNLOCK TABLES
。UNLOCK TABLES
は、非トランザクションテーブルロックを取得するために現在LOCK TABLES
でロックされているテーブルがある場合にのみ、トランザクションをコミットします。FLUSH TABLES WITH READ LOCK
はテーブルレベルのロックを取得しないため、このステートメントに続くUNLOCK TABLES
に対してコミットは発生しません。トランザクションをネストすることはできません。これは、
START TRANSACTION
ステートメントまたはそのシノニムのいずれかを発行するときに、現在のすべてのトランザクションに対して実行される暗黙的なコミットの結果です。XA トランザクションが
ACTIVE
状態にある間に、暗黙的なコミットを発生させるステートメントをそのトランザクションで使用することはできません。BEGIN
ステートメントは、BEGIN ... END
複合ステートメントを開始するBEGIN
キーワードの使用とは異なります。後者は暗黙的なコミットを発生させません。セクション13.6.1「BEGIN ... END 複合ステートメント構文」を参照してください。 データロードステートメント。
LOAD DATA INFILE
。LOAD DATA INFILE
は、NDB
ストレージエンジンを使用しているテーブルに対してのみ暗黙的なコミットを発生させます。詳細は、Bug #11151 を参照してください。管理ステートメント。
ANALYZE TABLE
、CACHE INDEX
、CHECK TABLE
、LOAD INDEX INTO CACHE
、OPTIMIZE TABLE
、REPAIR TABLE
。レプリケーション制御ステートメント。MySQL 5.6.7 から:
START SLAVE
、STOP SLAVE
、RESET SLAVE
、CHANGE MASTER TO
。(Bug #13858841)
MySQL 5.5.3 の時点では、以前は実行前に暗黙的なコミットを発生させたステートメントのほとんどが、実行後にも発生させます。その目的は、このような各ステートメントはいずれにしてもロールバックできないため、それを独自の特殊なトランザクションで処理することにあります。次のリストは、この変更に関連する追加の詳細を示しています。
以前は特殊なケースであった
CREATE TABLE
バリアント (InnoDB
テーブルに対するCREATE TABLE
やCREATE TABLE ... SELECT
) は、CREATE TABLE
が一様に実行の前後に暗黙的なコミットを発生させるため、現在では特殊ではなくなっています。FLUSH
およびRESET
ステートメントは暗黙的なコミットを発生させます。トランザクション制御およびロックステートメントは、以前と同様に動作します。