データベース 排他制御
目次
排他制御
データ同時実行性
多数のユーザーが同時にデータにアクセスできる事
データ整合性
通称「読取の一貫性」
各ユーザの更新が全てに反映され、各ユーザのデータ読み込み時に差が無い事
ユーザA:SELECT(長い時間が掛かる)
ユーザB:UPDATE(ユーザAのSELECT内容を変更)
ユーザA:SELECT終了→ユーザBのUPDATE内容は反映されない。
ユーザA:SELECT(長い時間が掛かる)
ユーザA:SELECT終了→ユーザBのUPDATE内容は反映されている。
デッドロック
(1)A:トランザクション開始
(2)B:トランザクション開始
(3)A:トランザクションでXテーブルのあるレコードをUPDATE
(4)B:トランザクションでYテーブルのあるレコードをUPDATE
(5)A:トランザクションで(4)のレコードをUPDATEしようとする→ロックがかかっているのでWAIT
(6)B:トランザクションで(3)のレコードをUPDATEしようとする→ロックがかかっているのでWAIT
→AB相互にWAIT=デッドロック
複数ユーザが同一トランザクションにおいて複数テーブルを続けて更新する場合に発生する。
デッドロック発生時のフローを設計しておく事が必要
ロックモード
モード | SELECT | 更新 | 複数設定 | 解除方法 |
---|---|---|---|---|
共有ロック | ○ | × | ○ | Commit/RollBack |
排他ロック | × | × | × | Commit/RollBack |
共有ロック
ユーザA:共有ロック
ユーザB:共有ロック○、排他ロック×
読み取り○、変更×
データの読み込み時のロック
OracleのSelect ~ For Update は共有ロック
排他ロック
=占有ロック
ユーザA:排他ロック
ユーザB:共有ロック×、排他ロック×
読み取り×、変更×
データの書き込み時のロック
Insert、Update時 は排他ロック
ロックの種類
行レベルロック
対象行のみをロック
複数ユーザーがデータベースを扱う場合に効率良い運用を行える
表ロック
ロック名 | 呼称 | 対象 | ロック方法 | ||||
---|---|---|---|---|---|---|---|
行共有 | RS | Row Share | Row | Share | 表 | Select For Update LOCK TABLE IN ROW SHARE MODE |
|
行排他 | RX | Row eXclusive | Row | eXclusive | 表 | Insert/Update/Delete LOCK TABLE IN ROW EXCLUSIVE MODE |
|
共有 | S | Share | Share | 表 | CREATE INDEX(VIEW、PROCEDURE、SYNONYM) LOCK TABLE IN SHARE MODE |
||
共有行排他 | SRX | Share Row eXclusive | Row | Share | eXclusive | 表 | LOCK TABLE IN SHARE ROW EXCLUSIVE MODE |
排他 | X | eXclusive | eXclusive | 表 | DROP(ALTER) TABLE LOCK TABLE IN EXCLUSIVE MODE |
トランザクション分離レベル
TransactionIsolationLevel
トランザクションが複数同時に行われた場合に、どれほどの一貫性、正確性で実行するか?の4段階の定義
=分離レベル
=隔離レベル
=独立性レベル
4段階の定義
(1)非コミット読取り
READ UNCOMMITTED
(2)コミット読取り
READ COMMITTED
(3)リピータブル・リード
REPEATABLE READ
(4)シリアライズ可能
SERIALIZABLE
↑低レベル。不都合な読み込みが発生し易い。しかし速い。
↓高レベル。不都合な読み込みが発生し難い。しかし遅い。
ダーティリード | ファジーリード | ファントムリード | |
---|---|---|---|
非コミット読取り READ UNCOMMITTED |
発生する | 発生する | 発生する |
コミット読取り READ COMMITTED |
発生しない | 発生する | 発生する |
リピータブル・リード REPEATABLE READ |
発生しない | 発生しない | 発生する |
シリアライズ可能 SERIALIZABLE |
発生しない | 発生しない | 発生しない |
ダーティ・リード
変更されたがコミットされてないデータを読み込んでしまう事
A:データ更新(未コミット)
B:データ読込
A:コミット
→Bの読み込んだデータと更新された内容が違う
排他ロックを掛ける事で防ぐ
ファジーリード
non-repeatable read
=反復不可能読み込み
複数回の読み込み結果が異なる事
B:データ読込
A:データ更新
B:データ読込
→1回目の読み込み内容と2回目の読み込み内容が違う
ファントムリード
複数回の読み込み時における増減データ
B:データ読込
A:データ追加(削除)
B:データ読込
→2回目の読み込み時には1回目には無かったデータがある(あったデータが無い)
各データベースソフトにおけるトランザクション分離レベル対応表
SQLServer | Oracle | Postgre | |
---|---|---|---|
READ UNCOMMITTED | ○ | × | × |
READ COMMITTED | ○ | ○ | ○ |
REPEATABLE READ | ○ | × | × |
SERIALIZABLE | ○ | ○ | ○ |
○ デフォルト設定