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 で呼び出すと例外です。