INSERTは自動コミットされますか?


13

私たちのアプリケーションは、レコードを追加するためにMySQLデータベースに対してINSERTクエリを起動します。レコードが自動コミットされるかどうかを知りたい。ROLLBACKコマンドを実行すると、データベースはいつロールバックを実行しますか?COMMITの後にROLLBACKは可能ですか?


わかりやすくするために、InnoDBはCOMMIT / ROLLBACKを使用しているため、19時間前に「innodb」とタグ付けしました。
-RolandoMySQLDBA

これにより、開発者とDBAにトランザクションの振る舞い、トランザクションをサポートする対応するアプリケーションパラダイム、およびその結果(良いか悪いか)に注意するように促す+1が得られます。
-RolandoMySQLDBA

私は私の答えの下にコメントであなたの質問に答えました。
-RolandoMySQLDBA

回答:


10

あなたの質問に対する答えは、あなたが複数のステートメントにまたがるトランザクション内にいるかどうかによって異なります。(質問にInnoDBのタグを付けましたが、答えはMyISAMで異なります。)

リファレンスマニュアルから:http : //dev.mysql.com/doc/refman/5.1/en/commit.html

デフォルトでは、MySQLは自動コミットモードを有効にして実行されます。つまり、テーブルを更新(変更)するステートメントを実行するとすぐに、MySQLは更新をディスクに保存して永続的にします。

はい、デフォルトでは、単にを使用INSERTしている場合、挿入したレコードはコミットされ、それらをロールバックしようとしても意味がありません。(これは、各ステートメントをBEGINとの間でラップすることと実質的に同じCOMMITです。)

ただし、トランザクションを明示的に処理している場合COMMIT、レコードの保存をコミットするために使用する必要がありますが、を使用することもできますROLLBACK

START TRANSACTION(またはBEGIN)を使用して、トランザクションを明示的に開始できます。これはautocommit設定に依存しません(デフォルトではオン):

START TRANSACTIONを使用すると、COMMITまたはROLLBACKでトランザクションを終了するまで、自動コミットは無効のままになります。その後、自動コミットモードは以前の状態に戻ります。

または、autocommit=0トランザクションの別の終わりに続くステートメントがトランザクションを開始すると思う場合(ただし、START TRANSACTION明示的に使用することもできます)。それは少なくとも私がこれ解釈する方法です:

自動コミットモード。1に設定すると、テーブルへのすべての変更がすぐに有効になります。0に設定した場合、COMMITを使用してトランザクションを受け入れるか、ROLLBACKを使用してキャンセルする必要があります。自動コミットが0で、それを1に変更すると、MySQLは開いているトランザクションの自動コミットを実行します。トランザクションを開始する別の方法は、START TRANSACTIONまたはBEGINステートメントを使用することです。セクション12.3.1「START TRANSACTION、COMMIT、およびROLLBACK構文」を参照してください。

より具体的には、「トランザクションを開始する別の方法」は、「autocommit = 0」の設定でトランザクションを開始するのに十分であることを意味するようです(少なくとも、セッション開始時またはCOMMIT/に続く各ステートメントの直前ROLLBACK)。とにかくを使用するBEGINか、START TRANSACTION明示的に使用することをお勧めしますautocommit=0。トランザクションが開始または終了するタイミングを明確にするためです。

(トランザクションの開始方法は、アプリケーションがMySQLを使用する方法に依存する場合があります。)


1
トランザクションプロトコルを完全に定義するには+1に値します。
RolandoMySQLDBA

@Bruno、「コミット」と「ロールバック」が機能しないMyISAMの場合、挿入は半分コミットされませんか?
Pacerier

7

デフォルトでは、InnoDBはautocommit = 1またはONに設定されています。一度コミットすると、ロールバックできません

無効にするには、次の2つのいずれかを実行する必要があります。

オプション1:これを/etc/my.cnfに追加し、mysqlを再起動します

[mysqld]
autocommit=0

オプション2:意味のあるSQLを開始する前に、オープンDB接続でこれらのいずれかを実行します

SET autocommit = 0;
START TRANSACTION;

これらの2つのオプションでは、手動のCOMMITまたは手動のROLLBACKを実行する必要があります

警告

テーブルがMyISAMの場合、説明は簡単です。MyISAMストレージエンジンにはトランザクションがないため、実行されるすべてのINSERT、UPDATE、およびDELETEは永続的です。ロールバックは一切ありません。


さらに明確にするために、私の答えはInnoDBとMyISAMストレージエンジンの両方に対応しています。
RolandoMySQLDBA

1
InnoDBで自動コミットがオフになっていて、アプリケーションが挿入クエリを起動している場合、コミットを実行するのを忘れると、変更はいつ失われますか?
RPK

アプリケーションが各INSERTの後に手動でCOMMITを起動する場合、書き込まれ、削除できません。コミットする前にDB接続が停止すると、すべての変更が失われ、ロールバックが発生します。DDL(CREATE TABLE、DROP TABLE、ALTER TABLEなど)を実行するか、手動でテーブルロックを発行すると、INSERTは自動的にコミットされます。START TRANSACTIONを使用すると、コミットされていないすべての変更がコミットされます。
-RolandoMySQLDBA

1
「START TRANSACTIONを使用すると、コミットされていないすべての変更がコミットされます。」(DDLのコンテキストでは、ロールバックされます)、前に暗黙的なコミットもあります(後の暗黙的なコミットは、ドキュメントによるとバージョン5.5.3からです)。
ブルーノ

1
「START TRANSACTIONを使用すると、コミットされていないすべての変更がコミットされます。」-私はその考えをMySQL 5.0認定スタディガイド(ISBN 0-672-32812-7)ページ418から得ました。 、DROP DATABASE、CREATE INDEX、BEGIN、およびALTER TABLE見出しの下にある「状況によっては、現在のトランザクションが暗黙的に終了することがあります。次のステートメントのいずれかを発行すると、InnoDBは現在のトランザクションの前のコミットされていないステートメントを暗黙的にコミットし、新しいトランザクション」。
RolandoMySQLDBA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.