【MySQL】トランザクション/ロールバック/autocommit

トランザクションとは?

「ここからここまではワンセットだぞ」な処理のこと。

例えば

  1. 何らかのSQL;
  2. 何らかのSQL;
  3. 何らかのSQL;
  4. 何らかのSQL;

みたいな処理が4つあったとして、この4つを実行した結果「1~3までは成功したけど4は失敗した」となった場合

  • 4つのSQLをトランザクションとして処理していたら・・・
    →1~3は実行されなかったことになるし、4も実行されない
  • 4つのSQLをトランザクションとして処理していなかったら・・・
    →1~3は実行されたままだし、4だけ実行されない

みたいな感じになる。

 

要するにトランザクションとして実行したSQLは

  • すべて実行する
  • すべて実行しない

のどちらかの選択肢しかなくなり、「途中まで実行する」という選択肢がなくなる。

ロールバック

さきほどの

「1~3までは成功したけど4は失敗した」みたいな場合に、「やっぱり1~3は実行しなかったことにしよう」な処理のことをロールバックと言う。

ネトゲの運営がしてユーザーがブチ切れるやつ。

MySQLのトランザクション

MySQLでは

START TRANSACTION
SQL文①;
SQL文②;
SQL文③;
COMMIT

と書くことで、中に書かれているSQL文①②③がトランザクションとなる。

  • START TRANSACTIONの部分はBEGINと書いてもよい

ロールバック

MySQLでは

START TRANSACTION
SQL文①;
SQL文②;
SQL文③;
ROLLBACK

と書くことで、中に書かれているSQL文①②③が実行されなかったことになる。

わざわざ実行したのに「やっぱりやめる」みたいな処理ってやる意味あるの?って感じだけど、以下のような場合に使うことがあるらしい。

  • 「いくつかSQLを実行していたけど最終的にユーザーがキャンセルした」のように、「処理をなかったことにしたい」というとき
  • 開発中に「データは変更したくないけどどうなるか試したい」みたいなとき
  • if文などの条件分岐で「やっぱりやめる」をしたいとき

トランザクションの終了

START TRANSACTIONしたあとは

  • COMMIT
  • ROLLBACK

のどちらかを実行する必要がある。

autocommitの値で挙動が変わる

MySQLではautocommitという変数の値で、トランザクションの挙動が変わる。

以下のような感じ。

autocommitがON autocommitがOFF
すべての処理が実行と同時にコミットされる?

はい

例えばDROP文を実行すると、実行と同時にコミットされる。なので危険。

いいえ

例えばDROP文を実行しても、COMMITを実行するまではコミットされない。なので安全。

START TRANSACTIONと打つことで、トランザクションを開始できる? はい
COMMITと打たなくてもコミットできる? どちらとも言えない

START TRANSACTIONを打った後はCOMMITが必要。

何も打たなかった場合は1行ごとに自動でコミットされるので不要。

いいえ

 

autocommitの値を確かめるには以下。

mysql> SELECT @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
  • 0:自動コミットOFF
  • 1:自動コミットON(デフォルト)

 

autocommitの値をOFFにするには、以下のようにする。

mysql> SET AUTOCOMMIT = 0;

 

このようにMySQLは「実行と同時にコミットする」がデフォルトらしいので(autocommitがデフォルトで1なので)

他のデータベースを使ってからMySQLを使い始めた人の中には「MySQL危なすぎだろ」と思う人もいるらしい。(というのをどこかの記事で見た気がする)

 

おわり

SQL
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました