hibernateで行ロック

2005年11月01日(火) 23:15

hibernateで行ロックを行う方法のメモ

やりたいこと:更新対象のレコードをロックして、更新する。

すぐに思いつくのが、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すれば良さそうだが)。
で、session#load(Class, Serializable, LockMode)。
  • 誤って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


 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar