hibernateで行ロック
2005年11月01日(火) 23:15
hibernateで行ロックを行う方法のメモ
やりたいこと:更新対象のレコードをロックして、更新する。
すぐに思いつくのが、Session#lock(Object, LockMode)。
やりたいこと:更新対象のレコードをロックして、更新する。
すぐに思いつくのが、Session#lock(Object, LockMode)。
- Objectはhibernateのマッピングオブジェクトな訳だけれど、Sessionに存在しない(newされたオブジェクト)を使用すると、org.hibernate.TransientObjectExceptionが発生する。
- DAO#get(key, session)で取得したオブジェクトを使用すると、次のようなSQLが投げられる。
select PK from TABLE where PK =? for update
getしてからlockをするまでの間に、別トランザクションで直にレコードを更新をすることができるので、ロックのかけ方がおかしい(もう一度getすれば良さそうだが)。
- 誤ってDAO#get(key, session)で取得したオブジェクトを第一引数に使用すると、org.hibernate.PersistentObjectException(既 にsessionに関連づけられたオブジェクトを再びsessionに登録しようとしたというエラー)が発生する(当然)。
- 正しく、マッピングクラス.classを第一引数に入れ、SerializableにPKの値を入れ、LockModeに
LockMode.UPGRADEを入れると、次のようなSQLが投げられ、マッピングクラスの値オブジェクトがリターンされる(やりたいことにマッチし
ているのはこれかな?)。
select A , B from TABLE where PK=? for update
