#トランザクション
私達がDMBSに対して複数のSQL文を送る際に1つの塊として送ることができます。この塊のことをトランザクションといいます。
このトランザクションがなぜ必要なのか、以下のケースで考えてみましょう。
##トランザクションの中断
例えば太郎さんが花子さんの口座に1000円振り込むとします。
このとき、不運にも停電が起き処理が中断したとします、
これでは太郎さんの残高は減っているのに花子さんの残高は以前のままです。これでは太郎さんと花子さんの仲が悪くなってしまいますね、、困ったもんです、、。
この事態を解決するためにある機能がトランザクションです。DBMSではトランザクション(一塊)を「一部だけが実行されることはあってはならない、途中で分割不可能なもの」として取り扱います。一塊を不可分(これ以上分けることができない)なものとして扱うトランザクションの性質を「原子性(atomicity)」といいます。
この原子性の機能を支える仕組みとして「コミット(commit)」と「ロールバック(rollback)」があります。
###コミット(commit)
トランザクション中での各処理を「仮の書き換え」としてトランザクション終了時に「仮の書き換え」をすべて確定します。この確定行為のことをコミットといいます。
###ロールバック(rollback)
このとき仮①と仮②の処理の途中で不運にもまた停電してしまったとします。その場合仮の書き換え(仮①)をキャンセルしてなかったことにします。この動作の仕組みを「ロールバック(rollback)」といいます。
###トランザクションの指定方法
1. BEGIN・・・開始の指示。この指示以降を一つのトランザクションとします。
2. COMMIT・・・終了の指示。この指示までを一つのトランザクションとし変更を確定する。
3. ROLLBACK・・・終了の指示。この指示までを一つのトランザクションとし、変更の取り消しをする。
##トランザクションの分離
トランザクションの中断の仕組みを理解したところで以下のケースの問題がまだ残されています。
①花子さんがATMで残高3,000から1,000を引き出す(仮)。
②①とほぼ同時に〇〇会社からの引き落としで1,000が引き落とされる(仮)。
③②のコミット前に中断する。このとき花子さんのなかでは残高は3,000だと思っている。
④②をコミットして確定する。
次に花子が残高を確認すると残高が1,000円になってしまっている。。
このような状況を解決するためにトランザクションでは「分離性(isolation)」という機能で対応します。
あるトランザクションを実行する際、他のトランザクションとは分離して実行し他のトランザクションと実行していた としてもあたかも単独で実行しているのと同じ結果となるように制御します。この機能を支える上で重要な機能が「ロック(Lock)」です。イラストで確認してみましょう。
上記イラストのようにトランザクション①が実行している時にロックを取得します。このトランザクションのコミットまたはロールバックが終了するとかけられたロックは解除されてトランザクション②が実行されます。
したがってロックされている状態では他のトランザクションは必然的に待機状態になります。このロックの待機時間は通常数ミリ以下と大変短いものになります。
またこのトランザクションの分離レベルは何種類かあります。気になる方は以下の記事の一読をオススメします。
https://qiita.com/song_ss/items/38e514b05e9dabae3bdb
##参考
書籍: スッキリわかるSQL入門 第2版 ドリル222問付き!
中山 清喬 著/飯田 理恵子 著