“悲観的ロック”を実装するにはどうすればよいですか? asp.netアプリケーションで?
質問
「悲観的ロック」のようなものを実装した経験のある方からアドバイスをお願いします。 asp.netアプリケーションで。これは私が探している行動です:
- ユーザーAが注文#313を開きます
- ユーザーBは注文#313を開こうとしますが、ユーザーAはX分間だけ注文を開いたと伝えられます。
以前にこの機能を実装したことがないので、設計に関するいくつかの質問があります:
- 注文記録にはどのデータを添付すればよいですか?私は検討しています:
- LockOwnedBy
- LockAcquiredTime
- LockRefreshedTime
LockRefreshedTime jQueryには非常に満足しているので、クライアントスクリプトを使用するアプローチを歓迎します。これは内部Webアプリケーションになるため、帯域幅/サイクルの使用にかなり寛大になります。また、「悲観的なロック」が起こるのではないかと思っています。この概念の適切な用語です。
解決
あなたはそこまで来ているようです。 LockRefreshedTimeが本当に必要だとは思わないが、実際には何も追加されない。 LockAcquiredTimeを使用して、ロックがいつ古くなったかを判断することもできます。
他にやりたいことは、トランザクションを利用することです。データベーストランザクション内でロックのチェックと設定をラップする必要があります。これにより、2人のユーザーが有効なロックを持っていると思うようになりません。
複数のリソースでロックを取得する必要があるタスク(つまり、特定のタイプの複数のレコードまたは複数のタイプのレコード)がある場合は、ロックを行う場所と同じ順序でロックを適用する必要があります。そうしないと、1ビットのコードでレコードAがロックされ、レコードBをロックしたいが、別のコードでBがロックされてレコードAを待機しているデッドロックを設定できます。
ロックが予期せず解除されないようにする方法について。ロックタイムアウトより長く実行される可能性のある長時間実行プロセスがある場合は、実行中にロックを更新するようにしてください。
「明示的なロック」という用語このロック時間の説明にも使用されます。
他のヒント
手動でこれを行いました。
- レコードの主キーをロックテーブルに保存し、レコードをマークする 編集するモード属性。
- 別のユーザーがこのレコードを選択しようとするとき、ユーザーの 準備のみの記録。
- レコードをロックするための最大時間を設定します。
- ロックされたレコードのページデータを更新します。ユーザーが許可されている間 変更を加えると、他のすべてのユーザーはチェックのみ許可されます。
ロックテーブルのデザインは次のようになります。
User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.
残りのロジックは、把握しなければならないものです。
これは、4年前にクライアントの特別なリクエストに基づいて実装したアイデアです。そのクライアントの後、誰も私に同じようなことをするように再び要求していないので、私は他の方法を達成していません。