排他制御
楽観的排他と悲観的排他
楽観的排他(楽観ロック)とは
- 考え方
- 「自分が操作している情報は,他の人が操作する可能性が少ない」という視点に基づいている。
- あるプロセスがデータを更新している間に、ほかのプロセスからも処理が可能だが、後から更新しようとしたプロセスは失敗する。
- 複数のユーザーが同じデータを見る(Readする)ことができるが、それが最新の情報かどうかは(アプリ側から)通知されるまでわからない。
- 実現方法
- 排他チェック用のカラムの値が、参照時と更新時で同じかどうかを検証する(値が異なっていれば他のプロセスによって更新されていることになる)。
- 排他チェック用のカラムには、更新日時(タイムスタンプ)やバージョン番号を使うのが一般的。
悲観的排他(悲観ロック)とは
- 考え方
- あるプロセスのデータを更新が終了するまで、(参照を含めて)ほかのプロセスは処理ができない。
- あるユーザーが参照・更新処理を行っている間は、ほかのユーザーは参照も更新もできない。
- 後のプロセスは、先のプロセスが終了するまで待たされることになる。
- 実現方法
- 更新対象の行を参照(SELECT)した時点でロックをかける( SELECT ~ FOR UPDATE (NOWAIT); )・・・?
ようわからんこと
- SELECT ~ FOR UPDATE (NOWAIT) でロックをとる、が悲観的排他の定義でいいのか?
参考サイト
最終更新:2011年09月18日 09:55