【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がONautocommitが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危なすぎだろ」と思う人もいるらしい。(というのをどこかの記事で見た気がする)

 

おわり

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

1991生まれ。
2019年くらいからフロントエンドエンジニアを目指している元アフィリエイターです💩

penpenをフォローする
penpenをフォローする
penpenメモ

コメント

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