MySQL - トランザクション

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

トランザクションとは、複数の処理を1つにまとめることである。

例えば、A -> B ->Cという順にフローが進む時、A、B、Cが全て問題なく実行可能な場合のみ同時に実行することをトランザクション処理という。
AとBの処理は成功したがCの処理に失敗した場合は、AおよびBの処理も実行されずロールバックされる。


トランザクション処理

  • START TRANSACTION文、または、BEGIN文は、新しいトランザクションを開始する。
  • COMMIT文は、現在のトランザクションをコミットして、その変更を永続的なものにする。
  • ROLLBACK文は、現在のトランザクションをロールバックして、その変更を取り消す。
  • SET autocommit文は、現在のセッションのデフォルトの自動コミットモードを有効または無効にする。


デフォルトでは、MySQLは自動コミットモードが有効の状態で動作する。
したがって、トランザクション内ではない場合、各ステートメントはSTART TRANSACTION文およびCOMMIT文で囲まれているかのようにアトミックである。
ROLLBACK文を使用して処理を元に戻すことはできないが、ステートメントの実行中にエラーが発生した場合、ステートメントはロールバックされる。

一連のステートメントに対して自動コミットモードを暗黙的に無効にするには、START TRANSACTION文を使用する。
START TRANSACTION文を実行する時、そのトランザクションをCOMMIT文またはROLLBACK文で終了するまで、自動コミットは無効のままとなる。
その後、自動コミットモードはその以前の状態に戻る。

 START TRANSACTION;
 SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
 UPDATE table2 SET summary=@A WHERE type=1;
 COMMIT;


複数の実行する処理をSTART TRANSACTION文またはBEGIN文とCOMMIT文またはROLLBACK文で囲む。

以下の例では、全ての処理がエラー無く完了する場合のみコミットされる。
もし、いずれかにおいてエラーが発生する場合は、コミットされずに自動的にロールバックされる。

 START TRANSACTION;
 -- <処理 1>;
 -- <処理 2>;
 COMMIT;


このように、一連の処理が全て完了する場合のみ実行されるものがトランザクション処理である。


自動コミットモード

自動コミットモードを明示的に無効にするには、変数autocommit0に設定する。
ただし、自動コミットモードを無効にした場合、データベースやテーブルの変更において、トランザクションセーフテーブル (InnoDBまたはNDBのテーブル等) への変更が永続的になることはない。
COMMIT文を使用して変更をディスクに格納する、または、ROLLBACK文を使用して変更を無視する必要がある。

 SET autocommit=0;


変数autocommitはセッション変数であるため、セッションごとに設定する必要がある。