#初めに
前回の続きです。
#トランザクション管理と排他制御
DBは複数の人が共有し、貯め込んだデータを出し入れできる便利なものです。
しかし、ユーザーが好き勝手にデータを操作できてしまうと大変なことになります。
例えば、店員が「ハサミ」を同時に客に売ったとして「在庫数」を更新しようとします。
本来であれば、「在庫数」は3->2
になり、2->1
になるのが普通です。
ですが片方の処理中にもう一方が読み書きしているため、「在庫数が3」のままで表示されてしまいます。
結局、後から更新した店員には前の店員の更新が反映されていないので
「ハサミの在庫数」はおかしなままで放置といったとんでもない事が起きてしまいます。
他にも「更新作業中に別の人によってデータが削除されてしまった
」など
誰も彼もが好き勝手に操作していると、データの不整合を引き起こしてしまいます。
そうした問題からDBを守るのがトランザクション管理
と排他制御
です。
##トランザクション
一連の処理をまとめたもの
をトランザクション
と呼びます。
先ほどの例で出てきた店員が「在庫数を確認する」->「在庫数の更新」の流れがそうです。
このトランザクション単位で更新処理を管理します。
##排他制御
処理中のデータをロックし、他の人が読み書きできないようにする機能
を排他制御
と呼びます。
つまり、トランザクションの間に使用するデータをロックしておけば
誰かに割り込まれてデータの不整合が生じるということが無くなるという訳です。
ロックする方法には2種類あり、
・共有ロック
:他のユーザーはデータを読むことはできますが、書くことは出来ません
・専有ロック
:他のユーザーはデータの読み書きが出来ません
といった特徴があります。
ロック機能は非常に便利な機能ですが注意
しないといけない場合があリます。
例えば、AとBのデータがあったとして
・トランザクション1では、Aにアクセスしていて更新のためにロック
・トランザクション2では、Bにアクセスしていて更新のためにロック
していたとします。
この場合、お互いが更新のためにロックしているので
どちらも違うデータにはアクセスできません。
つまり、「お互いがお互いのロック状態を永遠に待ち続ける
」といった事が引き起こされてしまいます。
これをデッドロック
と呼びます。
こうなってしまったら、いずれか一方のトランザクションを
強制的にキャンセル
しなければいけないので気を付ける必要があります。
##トランザクションに求められるACID特性
DBMS(データベース管理システム)では、トランザクション処理に対して
次の4つの特性(ACID特性
)が必須とされています。
#####◯Atomicity(原子性)
トランザクションの処理結果が
・全て実行されるか
・まったく実行されないか
のいずれかで終了し、中途半端に一部だけ実行されるようなことは許しません。
なので、あくまでも全ての処理が正常に終わった時のみ、その内容がDBに反映されます。
#####◯Consistency(一貫性)
DBの内容が矛盾のない状態であること
が重要です。
なのでトランザクションの処理結果が、矛盾を生じるような事になってはいけません。
#####◯Isolation(隔離性)
順番に実行した場合でも複数実行した場合でも処理結果が一致すること
が重要です。
つまり、排他処理(ロック機能)をきちんとやって相互に影響させないようにしないといけません。
#####◯Durability(耐久性)
正常に終了したトランザクションの処理結果は障害が発生してもDBから消失しないこと
が重要です。
何らかの復旧作業が保証されていないといけません。
##ストアドプロシージャ
ストアドプロシージャ
とはDBMSの機能の一つであり、DBを操作する一連の処理手順(SQL文)をコンパイルしてまとめ、DBMS側に保存した戻り値のない関数
です。
ユーザー側は指定するだけで即実行可能
です。
・ちまちまとSQL文を流す必要がないのでネットワークの負荷が軽減
できる
・即実行可能な形式なので処理速度の向上
が見込める
・保存も実行もDBMS側の機能なので呼び出し側の環境を気にせず、同じように利用可能
といったメリットがあります。
#おわりに
今回はここまでです。
間違っている部分や気になるところがあれば
コメントして下さると有り難いです。