トランザクションとは?
「ここからここまではワンセットだぞ」な処理のこと。
例えば
- 何らかのSQL;
- 何らかのSQL;
- 何らかのSQL;
- 何らかの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危なすぎだろ」と思う人もいるらしい。(というのをどこかの記事で見た気がする)
おわり
コメント