【ロック】楽観的ロックと悲観的ロック - notee/MySQL GitHub Wiki

更新系において、参照してからそのデータをもとに新しいデータを挿入する、という流れの中のどこで排他制御をかけるかという視点でのロックの違い。

楽観ロック

他者はそうそう同じリソースに変更を加えないだろう、という楽観的な視点での排他制御。

更新系において、参照時には全くロックを掛けず、新しいリソースの挿入時に参照データとバージョンが同じか、参照から更新の間に誰かに変更されていないか、をチェックしてから挿入する手法。参照から更新の間に元データに変更があったら変更を破棄する。

待ちが発生せず、更新の失敗がそのまま失敗として返ってくる。他者の更新通知を受け取らない。

主にアプリケーションレベルでかける->クライアントは他者の更新通知を受け取らない。

悲観ロック

他者が同じリソースに頻繁に変更を加えること前提の悲観的視点での排他制御。

更新系において、参照時に参照リソースにロックをかけ、新しいリソースの挿入完了時にロックをはずす手法。

待ちが発生するが、待っている作業に対して前の作業が終了したことが通知される。

主にDBレベルでかける->DBはクエリキューを持っている。