データベースのロック

複数のユーザーがレコードを同時に更新しようとすると、データベース ロック モデルによって各ユーザーからの更新が 1 つの単位として確実に実行されますが、それぞれの更新が前回の更新を上書きします。明示的な (ペシミスティック) ロック モデルは、データの更新が予期せず失われないようにし、複数のユーザーから同時更新が行われたときにワークフローを制御します。

使用できるのは、次の 2 つのロック モデルです。

オプティミスティック ロック

オプティミスティック ロック モデルによって、複数のユーザーが 1 つのレコードを同時に表示および変更できるようになりますが、最初のユーザーしか変更内容をコミットできません。ユーザーには、他のユーザーもそのレコードを更新しようとしていることは通知されません。

レコードの変更内容は、レコードがコミットされるときに検証されます。別のユーザーがすでに正常にレコードを更新済みの場合、ほかの同時更新には、これらの他のユーザーが同時更新を登録しようとしたときに、競合が存在することが通知されます。

デフォルトでは、レコードは ClearQuest クライアント アプリケーションで表示中はロックされません。このために、単一サイトまたは複製環境を使用するスキーマ設計を考慮してください。

データ保全性は、ユーザーが [適用] ボタンをクリックした時点で、まだ変更内容の処理中に、別のユーザーがレコードを更新してその変更内容を登録したかどうかをチェックすることによって確実にされます。別のユーザーが登録した場合には、ユーザーの更新内容はデータベースに登録されません。これは、別のユーザーの変更内容の一部が失われる可能性があるからです。別のユーザーがレコードを更新した後でユーザーが変更内容を登録しようとすると、変更内容はデータベースに登録されなかったことを示すエラー メッセージが送信されます。

複数の関連レコードへの整合更新が関係する複雑なシナリオの場合には、この動作で問題を発生しないように注意する必要があります。オプティミスティック ロックはレコードごとに個別に有効なので、レコードは正しい順序で更新されることと、アクションの開始時点から変更内容の登録までの間に別のユーザーが従属レコードを更新した場合に、この従属レコードの更新の失敗に対する処理を、アプリケーションで確実に行う必要があります。スキーマ設計で操作を再試行したり、障害を確認して親レコードの更新を元に戻すことができます。あるいは、従属レコードの更新が失敗しても、親レコードの更新を登録することもできます。

スキーマ設計で、次のレコードが変更可能なケースに対処する必要があります。
  • しかし、レコードは変更中に別のユーザーによって変更されたので、変更は失敗します。
  • 従属レコードは変更可能ですが、従属レコードは変更中に別のユーザーによって変更されたので、変更は失敗します。

ペシミスティック ロック

ペシミスティック ロックは、複数のユーザーが同時にレコードを編集するような状況が起こらないようにする仕組みです。 ペシミスティック ロック モデルは、レコードに順 次変更を強制し、レコードが同時に更新されないようにします。このモデルでは、1 人のユーザーがレコードの更新を始めるとすぐに、レコードがロックされます。このレコードの更新を始めようとする他のすべてのユーザーには、別のユーザーがすでに更新を進行中で、変更されないようロックされていることが通知されます。 レコードを同時に更新しようとしているユーザーは、最初のユーザーがレコードのコミットを完了するまで待機する必要があります。その後で他のユーザーにロックが許可され、前のユーザーの変更の後に変更を加えることができるようになります。この モデルでは、競合を防ぐことによって 、競合 の解決の問題を回避します。更新は連続して行われ、次に続 く更新のそれぞれは、前のユーザーによる変更が加えられた、すでに更新済みのレコードから始まります。

ただし、ロックを取得して、ほかのユーザーがレコードの更新を試みないようにする必要があります。このモデルには、次のことに対処するロック管理戦略が必要です。
  • ロックの取得
  • レコードを同時に更新しようとしているユーザーへの、ロックがリリースされるまで待機する必要があるという通知
  • ロックがリリース済みであるという、ユーザーへの通知
  • 中止されたロックの解放 (システムの異常終了や、更新の完了を忘れている場合など)

ペシミスティック レコード ロックを使用するには、それを使用するレコード タイプにフック コードを追加する必要があります。フック コードは、レコード タイプごとに新しい Base アクションとして追加する必要があります。 手動でのロックの削除は、レコード スクリプト別名として実装されているフック コードを使用して実行することができます。ClearQuest クエリーを使用して、locked_by フィールドが NULL 以外の値に等しいレコードを検索することによって、ロックされたレコードを検索できます。locked_by ユーザー データベース列は、レコードがロックされるときにユーザーのログイン ID を記録する整数列です。

ペシミスティック ロックは、本当の意味での同時更 新の必要 がなく、前回の更新が完了するまで次の更新を遅らせることができる場合に、有用なモデルです。 これは、通常は、更新は非常に短い時間間隔で行われることを暗に示しています。更新で長 期間 ロック状態が続く場合、ほかのユーザーがレコードを 更新できなくなります。


フィードバック