MySQL - トランザクション
概要
トランザクションとは、複数の処理を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;
このように、一連の処理が全て完了する場合のみ実行されるものがトランザクション処理である。
自動コミットモード
自動コミットモードを明示的に無効にするには、変数autocommit
を0
に設定する。
ただし、自動コミットモードを無効にした場合、データベースやテーブルの変更において、トランザクションセーフテーブル (InnoDBまたはNDBのテーブル等) への変更が永続的になることはない。
COMMIT
文を使用して変更をディスクに格納する、または、ROLLBACK
文を使用して変更を無視する必要がある。
SET autocommit=0;
変数autocommit
はセッション変数であるため、セッションごとに設定する必要がある。