楽観的ロックと悲観的ロック

説明用にメモ。

【楽観的ロック】
アプリケーションレベルのロックのこと。
テーブルに最終更新日時を管理するカラムや
更新回数を管理するカラムを持てせておき、
コード上で制御する。

具体的には・・・・・

UPDATE対象のレコードをSELECTして、更新日時を取得する。

その更新日時をUPDATE文の WHERE に指定する。

# UPDATE tb_test SET point = 100 WHERE id = 5 AND update_time = '2014-10-10 00:00:00'


レコードが更新されていなければ無事UPDATEされる。
更新されている場合は WHERE の update_time 条件によってUPDATEされない。

UPDATEされたかどうかをコード側で判断して次の処理につなげる。



【悲観的ロック】
DBレベルのロックのこと。
簡単に言うと SELECT … FOR UPDATE を利用したもの。
DBレベルでロックされるので、アプリケーション側でコードを書く必要がない。

整合性は保たれる反面、
ロック解除待ちが発生したり、
デッドロックになったり、
テーブルロックしちゃったり
面倒な現象が多い。
ちゃんと理解してないとトラブル可能性がある。