説明用にメモ。
【楽観的ロック】
アプリケーションレベルのロックのこと。
テーブルに最終更新日時を管理するカラムや
更新回数を管理するカラムを持てせておき、
コード上で制御する。
具体的には・・・・・
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レベルでロックされるので、アプリケーション側でコードを書く必要がない。
整合性は保たれる反面、
ロック解除待ちが発生したり、
デッドロックになったり、
テーブルロックしちゃったり
面倒な現象が多い。
ちゃんと理解してないとトラブル可能性がある。