はじめに
ロックとトランザクションについてめちゃくちゃ噛み砕いてまとめてみました。私も深いとこまではまだまだ勉強不足ですが、イメージは伝わるようにまとめてみました。まずは雰囲気を掴みたい!という人向けです。
ロックとトランザクションについてイメージを掴みましょう
なんで必要なの?
複数人が同時に同じデータを見たり(SELECT)、更新したり(UPDATE)したとします。
そうすると、Aさんが見ている間にBさんが更新しちゃったり、Aさんが削除したデータをBさんが更新しようとしちゃったりと、困ったことが起きる感じしますよね。
それを解決するのが、「ロック」と「トランザクション」です。
「ロック」についてちょっと詳しく
ざっくり言うと
自分がそのデータを見たり変更したりしている時、他の人には操作させないぞ!鍵をかけちゃうぞ!っていうものです。
自分のやりたいことが終わったらロック解除するからちょっと待ってて!っていう感じです。
ロックには 「READ LOCK」(読み込みのためのロック) と 「WRITE LOCK」 (書き込みのためのロック)の2種類があります。
READ LOCK (読み込みのためのロック)
いま私が見ています!(SELECT)
他の人は見てもいいよ!(SELECT:○)
でも変更はしないでね!(UPDATE, DELETE...etc:×)
っていう感じです。
WRITE LOCK (書き込みのためのロック)
いま私が変更しています!(UPDATE, DELETE...etc)
他の人は見ないでね!(SELECT:×)
変更もしないでね!(UPDATE, DELETE...etc:×)
っていう感じです。
「トランザクション」についてちょっと詳しく
ざっくり言うと
連続してデータ操作をいくつか行う時、その一連の操作をまとめることができ、そのまとまりを「トランザクション」と呼びます。
そして、トランザクション(一連の操作)ごとに 確定 や 取り消し ができます。
それの何がいいの?
以下の場面を考えてみましょう
・AさんからBさんに、口座を通して10万円振込むとします
・その時にはまず、Aさんの口座から-10万円というデータ操作(①)をします
・次に、Bさんの口座に+10万円というデータ操作(②)をします
・この時に、①は行われたのに②が行われないと、大変なことになってしまいます。10万円がどこかに行ってしまいますね。
こんな時にトランザクションの機能が役に立つ!
・ここで①と②をトランザクションとしてまとめると...
・①②両方の操作が完了してから、トランザクション全体を 「確定」 することが出来ます
・もし②だけ完了しなかったら、トランザクション全体を 「取り消し」 たり出来ます。
これのおかげでデータ操作の矛盾を防ぐことが容易になります!
実際にトランザクションを制御してみよう
1.autocommitの無効化
autocommitというものが有効になっていると、全てのデータ操作が1つのトランザクションとなってしまいます。
自分でトランザクションを制御するには、autocommitを無効にする必要があります。 (4/21 編集)
↑この考えは、勘違いでした。autocommitが有効になっていてもトランザクションを制御することは出来ます。
この記事(MySQLのAUTOCOMMIT(オートコミット)覚え書き)がとても分かりやすいです。
まずは、autocommitが現在どうなってるか確認しましょう。
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
有効になっているので、無効化してあげましょう。
set autocommit=0;
2.トランザクションの開始
トランザクションを開始します!と宣言しましょう。
start transaction;
3.データ操作
さっきの話でいう、-10万円したり+10万円したりですね。
このトランザクションで行いたいことをしてあげましょう。
4-1.確定
このデータ操作でOK!って思ったら、確定しましょう。
commit;
4-2.取り消し
このデータ操作やっぱりやめた!って思ったら、取り消しましょう。
rollback;
まとめ
こんな感じに概念をざっくりと理解すれば、あとは実際に使いながら覚えていけるんじゃないかなと思っています。