This is a cache of http://dbflute.seasar.org/ja/manual/function/ormapper/conditionbean/sidebar/lockforupdate.html. It is a snapshot of the page at 2024-11-01T00:29:03.959+0000.
LockForUpdate | DBFlute

LockForUpdate

概要

基本概念

更新ロックを取得する検索にします。

SQL上では、それぞれ DBMS ごとの構文を利用します。例えば、PostgreSQL や MySQL であれば "for update"、Oracle であれば "for update of [pk-name]" など。

会話上では、ろっくふぉーあっぷでいと もしくは単に ふぉーあっぷでいと と表現します。

ロック対象のテーブル

基本的には、基点テーブルに対してのみロックを取得しますが、DBMS によってはどうしても結合したテーブルも含めてしまう場合があります。例えば、Oracle であれば、"for update of [column]" という構文でロックを取得するテーブルを限定できますが、そういったことができない DBMS も存在します。業務的な要件と照らし合わせて注意して利用する必要があります。

必要性の検討 (楽観的並行性制御の利用)

そもそも楽観的並行性制御が適用できる排他制御要件であれば、その仕組みが DBFlute には備わっているため LockForUpdate を使う必要はないかもしれません。実装する前によく吟味すると良いでしょう。 (更新ロックが本当に必要である場面でのみ使うように)

DBMS 独自の更新ロック取得

例えば、Oracle の "for update no wait" などの、DBMS 独自の拡張された更新ロックの取得に関しては、オプションで提供されています。

実装方法

実装の流れ

ConditionBean の lockForUpdate() を呼び出します。

e.g. 更新ロックを取得 (Eclipseでコード補完) @Java
MemberCB() cb = new MemberCB();
cb.setupSelect_MemberStatus();
cb.query().addOrderBy_Birthdate_Desc();
cb.loF // .loF と打って enter
--
cb.lockForUpdate();

メソッド仕様

複数回呼び出しは上書き

複数回 LockForUpdate を呼び出した場合は、内部的には単なる上書きです。(業務的には無意味)

更新ロックがサポートされていないDBMS

更新ロックがサポートされていない DBMS で呼び出すと例外です。