データベース 排他制御

排他制御

データ同時実行性

多数のユーザーが同時にデータにアクセスできる事

データ整合性

通称「読取の一貫性」
各ユーザの更新が全てに反映され、各ユーザのデータ読み込み時に差が無い事
ユーザ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 

デフォルト設定