Open4
トランザクション分離性について調べる
Anomaly 調査
応用情報の試験に出てくる Anomaly はこの 3 つっぽい
- Dirty Read
- Fuzzy Read / Non Repeatable Read
- Phantom Read
ただ他にも以下のAnomaly があるみたい - Lost Update
- Read Skew
- Write Skew
- Observe Skew
見た記事
RDBMS でサポートされている分離レベル
- Read Uncommited
- Read Commited
- Repeatble Read
- Serializable
分離性とパフォーマンスのトレードオフ
全ての Anomaly を防ぐのは、分離レベルを Serialize にすればいい。
しかし常に実行できるトランザクションが 1 つとなり、トランザクションを実行するまでの待ち時間が長くなってしまうためパフォーマンスが落ちる。
MVCC で解決?
各トランザクションが開始時にデータのスナップショットを用意して、自分のスナップショットに対してデータの読み書きを行うこと。
スナップショットを取得して後から整合性を確かめるなら楽観的ロックになるのかな?
という楽観的ロックってなんだったっけ?
排他制御
同じデータに対しての同時アクセスによる不整合を防ぐために、直列に処理するように制御すること
楽観的ロック
めったなことで同時更新は起きないということを前提とした排他制御。
更新対象のデータがデータ取得時と同じ状態であることを確認してから更新する。
デメリット
データ更新で利用される画面入力に時間がかかる業務の場合は最初からやり直しになってしまう。
悲観的ロック
同時更新が頻繁に発生することを前提とした排他制御
更新対象のデータを取得する際にロックを変えることで、他のトランザクションから更新されないようにする。
デメリット
ロックの解放漏れが発生した場合、いつまで経っても他のトランザクションでデータにアクセスできなくなる。