ロック処理

最終更新日: 2022年10月7日

悲観ロックと楽観ロック

Wagbyではモデル単位でロック方式を指定することができます。標準は悲観ロックです。

補足

コラム「【Wagbyのこだわり】データのロック」にて、その必要性やロック方式の違いなどを詳しく解説しています。ぜひご一読ください。

悲観ロックの動作例

あるユーザがデータの更新画面を開いているとき、別のユーザが同じデータの更新画面を開こうとすると、図のようにエラーメッセージが表示され、更新画面を開くことができません。

悲観ロックの動作例

悲観ロックと楽観ロックの違い

両者の違いは次の通りです。

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

ロック方式を選択する

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

ロック方式の選択

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

ワンポイント

「悲観ロック」と「楽観ロック」は両方、有効にすることができます。この場合、Wagbyの利用者視点からは、悲観ロックで動作しますが、更新処理で(楽観ロックの)バージョンカラムも更新されます。そのため、Wagby が提供する REST API を使って外部からデータを更新したい場合、このバージョン管理用カラムを使ってロックを制御することができるようになります。

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

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

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

どのロック方式を選択するべきか

通常は悲観ロックとする

Wagbyの標準は「悲観ロック」です。競合が発生しないため、もっとも問題の少ない方法であり、こちらの利用を推奨します。

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

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

楽観ロックは、Wagbyと外部のシステムが、データベースに用意されたバージョン管理用カラムを共用できます。いずれのシステムから更新された場合でも、確実に競合を検出することができます。

楽観ロックに限定されるパターン

次の画面機能を利用する場合、そのモデルは楽観ロックになります。