データベース 排他制御

排他制御

データ同時実行性

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

データ整合性

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

○ デフォルト設定

Follow me!