サポート > リポジトリ > モデル > ロック方式

Wagbyでは楽観ロック方式と悲観ロックを方式を選択することができます。

Wagbyではモデル単位でロック方式を指定することができます。標準は悲観ロックです。 両者の違いは次のとおりです。

楽観ロック 悲観ロック(標準)
特徴 同じデータの更新画面を、同時に複数の利用者が開くことができます。最初の更新者のみが書き込みに成功します。それ以外の更新はすべて失敗します。 同じデータの更新画面を開くことができる利用者はただ一人に限定されます。他の利用者は、そのデータを閲覧することはできますが、更新画面を開くことはできません。
書き込みの競合 いったん更新画面をキャンセルし、再び更新画面に入り直す必要があります。修正途中のデータは無効になります。 動作の仕組み上、書き込みの競合は発生しません。最初の利用者が更新を終えるまで、他の利用者は更新処理を待つことになります。
競合時の対応 競合が発生して更新が失敗した場合でも、画面上には入力データが残っているため、利用者の方で復旧処理を工夫することはできます。例えば、入力済みの値をテキストエディタなどに一時コピーし、再び更新処理を行うといったことが考えられます。 更新画面を開いた利用者が、長時間、画面を更新状態にしておくことに一定の時間制限を用意するようにします。これをセッションタイムアウトといいます。Wagbyの標準は20分です。"環境 > アプリケーション > 初期パラメータ"で変更することができます。
ロックの実現方法 モデル内に「バージョン管理用カラム」という項目を用意します。型は8バイト整数です。更新画面を開いたとき、同項目の値を読み込みます。更新処理時に再び値を読み込み、最初に読み込んだ値と変わっていなければ更新を成功させます。 Wagby内部の「ロックマネージャ」を利用します。更新画面を開いた際に、ロックを取得します。更新終了時にロックを解放します。
ロック解放のタイミング -
  • データを更新する(トランザクション終了時にロック解放)
  • メニュー画面を表示する
  • ログオフする(セッションタイムアウトも含む)

更新画面での悲観ロックの挙動を"画面機能 > 更新"で説明しています。

「画面>その他>データベースの詳細」から、ロック方式を選択することができます。

図1 ロック方式の選択

楽観ロックと悲観ロックは、少なくともいずれか一方を選択する必要があります。標準では悲観ロックです。(悲観ロックにチェックが付いた状態で、かつ入力不可となっています。)

楽観ロックのチェックボックスを有効にすると、悲観ロックのチェックボックスとバージョン管理用カラム名が入力可となります。ここで入力した項目名で、型が「8バイト整数」の項目が自動的に追加されます。

ここで入力した項目名は「モデル項目」欄には表示されませんが、内部で管理されます。そのため「モデル項目」の欄に、この項目を定義する必要はありません。

バージョン管理用カラム名は必須チェックを行ないます。未入力状態でフォーカスがセットされると「この値は必須です」というエラーメッセージが表示されます。

なお「悲観ロック」と「楽観ロック」は両方、有効にすることができます。この場合、Wagbyの利用者視点からは、悲観ロックで動作しますが、更新処理で(楽観ロックの)バージョンカラムも更新されます。そのため、Wagbyと外部のシステム(または自作のバッチ処理プログラム)が、データベースに用意されたバージョン管理用カラムを共用したいという場合に使うことができます。

サブモデル利用時の注意点

ロック方式はメインモデルとサブモデルで一貫性を保つようにしてください。

例えばサブモデルのみ楽観ロックを有効にした場合、メインモデルに存在しないバージョン管理カラムを利用しようとしてエラーとなります。

通常は悲観ロックとする

Wagbyの標準は「悲観ロック」です。競合が発生しないため、もっとも問題の少ない方法です。

楽観ロックを選択した方がよい場合

外部システムとの連携を考慮する場合、楽観ロックを用いた方がよい場合があります。

悲観ロックは、Wagbyが内部で用意したロックマネージャを使います。そのため、今どのデータがロックされているかを外部システムが知るためには特別な工夫が必要です。

楽観ロックは、Wagbyと外部のシステムが、データベースに用意されたバージョン管理用カラムを共用できます。いずれのシステムから更新された場合でも、確実に競合を検出することができます。(例えばバッチ処理プログラムを独自に開発した場合、楽観ロックのバージョン管理カラムを参照することで競合の検出が可能です。)

Wagbyの楽観ロックと悲観ロックの実装方法をこちらにまとめています。

Wagbyの「悲観ロック」は、内部でロックマネージャをもっています。このロックマネージャはメモリ内にロックを保持します。詳細...

Wagbyの「悲観ロック」のロックキーをカスタマイズすることができます。トランザクション処理のためのカスタマイズコードを記述するときに対象データのロック管理を細かく制御したい場合に適用できます。詳細...

Wagby Developer Day 2018