・悲観ロック
DBMS(死語?)が管理して、データ更新時にかかるロック。
DBでテーブルロックと言えばほぼ悲観ロック。
同一トランザクション上でしか制御できない(しない)。
・楽観ロック
DBMS(死語?)では管理しきれない、処理が複数のセッション(トランザクション?)にまたがる場合のロック方式。
Web系のシステムではこちらが主?
ロックテーブルに「更新カウンタ」もしくはデータの「バージョン番号」を示すカラムを設け、
データ更新時にこの値を取得して、事前に取得していたこの値と比較して同じでなければ、
他のセッションから更新がかかったとして、自セッションの更新を破棄する。
(同一であれば自セッションのデータで更新する)
例:
(1)更新用画面のためにDBからデータを取得 ・・・ 「更新カウンタ」=1
(2)更新用画面を表示
(3)更新用画面でデータを入力
(4)更新用画面から更新済みデータを受信
(5)更新可否確認のためにDBからデータを取得(ここは悲観ロックが必要?)
(5)-1 「更新カウンタ」=1
更新可能と判断し画面からのデータでDBのデータを更新
(5)-2 「更新カウンタ」≠1
別セッションから先に更新がかかったと判断
( (1)で取得したデータはすでに古いものということ )
更新不可と判断し、その旨の処理を行う
( メッセージ出力なり )
PR