Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
EPUB - 7.5Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


13.3.3 暗黙的なコミットを発生させるステートメント

このセクションに示されているステートメント (およびそのすべてのシノニム) は、ユーザーがこのステートメントを実行する前に COMMIT を実行したかのように、現在のセッション内でアクティブなすべてのトランザクションを暗黙的に終了します。MySQL 5.5.3 の時点では、これらのステートメントのほとんどが、実行後に暗黙的なコミットも発生させます。詳細は、このセクションの最後を参照してください。

  • データベースオブジェクトを定義または変更するデータ定義言語 (DDL) ステートメント。ALTER DATABASE ... UPGRADE DATA DIRECTORY NAMEALTER EVENTALTER PROCEDUREALTER SERVERALTER TABLEALTER VIEWCREATE DATABASECREATE EVENTCREATE INDEXCREATE PROCEDURECREATE SERVERCREATE TABLECREATE TRIGGERCREATE VIEWDROP DATABASEDROP EVENTDROP INDEXDROP PROCEDUREDROP SERVERDROP TABLEDROP TRIGGERDROP VIEWRENAME TABLETRUNCATE TABLE

    ALTER FUNCTIONCREATE FUNCTION、および DROP FUNCTION もまた、ストアドファンクション (ただし、UDF を除く) で使用された場合は暗黙的なコミットを発生させます。(ALTER FUNCTION は、ストアドファンクションでのみ使用できます。)

    CREATE TABLE および DROP TABLE ステートメントは、TEMPORARY キーワードが使用されている場合はトランザクションをコミットしません。(これは、コミットを発生させる ALTER TABLECREATE INDEX などの、一時テーブルに対するその他の操作には適用されません。) ただし、暗黙的なコミットは発生しませんが、ステートメントのロールバックもできません。つまり、このようなステートメントを使用すると、トランザクションのアトミック性が侵害されます。たとえば、CREATE TEMPORARY TABLE を使用したあとにトランザクションをロールバックしても、そのテーブルは存在し続けます。

    InnoDB での CREATE TABLE ステートメントは、1 つのトランザクションとして処理されます。つまり、ユーザーが ROLLBACK を発行しても、ユーザーがそのトランザクション中に実行した CREATE TABLE ステートメントは元に戻されません。

    CREATE TABLE ... SELECT は、一時テーブル以外のテーブルを作成している場合、そのステートメントが実行される前後に暗黙的なコミットを発生させます。(CREATE TEMPORARY TABLE ... SELECT に対してコミットは発生しません。)これは、ロールバック後にマスター上でテーブルを作成できたが、バイナリログへの記録に失敗したため、スレーブにはレプリケートされないというレプリケーション中の問題を回避するために行われます。詳細は、Bug #22865 を参照してください。

  • mysql データベース内のテーブルを暗黙的に使用または変更するステートメント。CREATE USERDROP USERGRANTRENAME USERREVOKESET PASSWORD

  • トランザクション制御およびロックステートメント。BEGINLOCK TABLESSET autocommit = 1 (この値がまだ 1 でない場合)、START TRANSACTIONUNLOCK 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 INFILELOAD DATA INFILE は、NDB ストレージエンジンを使用しているテーブルに対してのみ暗黙的なコミットを発生させます。詳細は、Bug #11151 を参照してください。

  • 管理ステートメント。ANALYZE TABLECACHE INDEXCHECK TABLELOAD INDEX INTO CACHEOPTIMIZE TABLEREPAIR TABLE

  • レプリケーション制御ステートメント。MySQL 5.6.7 から: START SLAVESTOP SLAVERESET SLAVECHANGE MASTER TO。(Bug #13858841)

MySQL 5.5.3 の時点では、以前は実行前に暗黙的なコミットを発生させたステートメントのほとんどが、実行後にも発生させます。その目的は、このような各ステートメントはいずれにしてもロールバックできないため、それを独自の特殊なトランザクションで処理することにあります。次のリストは、この変更に関連する追加の詳細を示しています。

  • 以前は特殊なケースであった CREATE TABLE バリアント (InnoDB テーブルに対する CREATE TABLECREATE TABLE ... SELECT) は、CREATE TABLE が一様に実行の前後に暗黙的なコミットを発生させるため、現在では特殊ではなくなっています。

  • FLUSH および RESET ステートメントは暗黙的なコミットを発生させます。

  • トランザクション制御およびロックステートメントは、以前と同様に動作します。


User Comments
Sign Up Login You must be logged in to post a comment.