SQL基礎 トランザクションについて

SQL トランザクション

SQLをもう一度再学習しようと思い、まとめていきます。
今回の記事は、下記の本を参考にしています。
スッキリわかるSQL入門 第2版 ドリル222問付き! スッキリわかるシリーズ
理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL (WEB+DB PRESS plus)

 

トランザクション

トランザクション

データを正しく保つための手法。
複数の処理を一つにまとめておこうなうこと。
指定したトランザクション内のすべての処理が終了しない限り、実行完了できない。

railsのコードだと下記のように実装されます。

 

トランザクション原則

ACIDで省略されることが多いです。

原子性

トランザクションの操作すべてが、トランザクションが成功しているかトランザクションが失敗しているかのどちらかになっていること。
トランザクションが成功しているとは、すべての処理が成功していることで、
トランザクションが失敗していることとは、ロールバックできていることを指しています。

一貫性

トランザクションを実行した前後で、データの一貫性が保たれていること。

分離性

同時に実行した際、複数のトランザクションが影響を与えないこと。

永続性

処理が完了したトランザクションの履歴は消えないこと。

 

複数の利用者が同時に処理行う場合の副作用

トランザクションはこの「複数の利用者が同時に処理行う場合の副作用」を防ぐためにあると言えます。
代表的な3つだけあげておき、

ダーティリード

未確定(まだコミットしていない)の情報を他の人が読めてしまうことです。
下記の具体例でいうと、上記①②が同時に実行され、①のA-2が途中でロールバックした場合に問題がおきます。
「A-1」の後に「B-1」の処理がはしり、「A-2」がロールバック、そして「B-2」がコミット完了すると、1万円は引き出せなかったけど、
口座の金額は、1万円引かれたまま、5千円が減ることになるので、残高は1万5千円になります。
本来は、①の処理が中断されているなら、残高は2万5千円になるべきです。

前提:
Aさんの口座には、3万円入っているものとし、
①、②の諸襟が同時に行われるものとします。

①Aさんの処理
A-1. Aさんの口座から1万円引き出そうとする(Update)
A-2. commit

②Bの会社の処理
B-1. Aさんの口座から 5千円減らす(UPDATE)
B-2. commit

ノンリピータブルリード

同じデータを複数回読み取っている際に、
下記の例でいうと、「C-1」の後に「D-1」が実行されると、「C-1」と「C-2」の値に矛盾が生じてしまいます。

前提:
①、②の諸襟が同時に行われるものとします。

①Aさんの処理
C-1. 出費の合計値を求める(SELECT)
C-2. 出費の最大値を求める(SELECT)

②Bさんの処理
D-1. 出費の一つのカラムを更新