私たちのアプリケーションは、レコードを追加するためにMySQLデータベースに対してINSERTクエリを起動します。レコードが自動コミットされるかどうかを知りたい。ROLLBACKコマンドを実行すると、データベースはいつロールバックを実行しますか?COMMITの後にROLLBACKは可能ですか?
私たちのアプリケーションは、レコードを追加するためにMySQLデータベースに対してINSERTクエリを起動します。レコードが自動コミットされるかどうかを知りたい。ROLLBACKコマンドを実行すると、データベースはいつロールバックを実行しますか?COMMITの後にROLLBACKは可能ですか?
回答:
あなたの質問に対する答えは、あなたが複数のステートメントにまたがるトランザクション内にいるかどうかによって異なります。(質問に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を使用する方法に依存する場合があります。)
デフォルトでは、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は永続的です。ロールバックは一切ありません。