2009-03-06 7 views
5

私は、asp.netアプリケーションで "悲観的なロック"のようなものを実装する経験のある人からアドバイスをいただきたいと思います。これは私が探している動作です:asp.netアプリケーションで「悲観的なロック」を実装するにはどうすればよいですか?

  1. ユーザーA開くために#313
  2. ユーザBは、注文#313を開こうとしたが、ユーザーAは、注文がX分間排他的に開か持っていたと言われています。私は前にこの機能を実装していないので

、私はいくつかの設計上の質問がある:

私が注文レコードに添付する必要がありますどのようなデータ
  • ?私が検討している:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

を私はLockRefreshedTime <場合はロックを解除、レコード考えるでしょう(今 - 10分)。

  • ロックが必要以上に長く保持されないようにするにはどうしますか?予期せず有効期限は切れません。

私はjQueryにとても慣れているので、クライアントスクリプトを利用するアプローチは大歓迎です。これは内部のWebアプリケーションなので、私は帯域幅/サイクルの使用にかなりリベラルなことができます。また、「悲観的なロック」がこのコンセプトの適切な用語であるかどうかも疑問です。

答えて

8

ほとんどの方法があるようです。私はあなたが本当にLockRefreshedTimeを必要とは思わない、それは本当に何も追加していない。 LockAcquiredTimeを使用して、ロックが古くなったときを判断することもできます。

あなたがやりたいことは、トランザクションを利用することです。データベーストランザクション内でロックのチェックと設定をラップする必要があるため、有効なロックを持っていると思う2人のユーザーで終わることはありません。

複数のリソース(つまり、特定のタイプの複数のレコードまたは複数のタイプのレコード)でロックを取得する必要のあるタスクがある場合、そのロックを同じ順序で適用する必要がありますロック。それ以外の場合は、デッドロックが発生する可能性があります.1ビットのコードにAレコードがロックされ、Bレコードがロックされ、BコードがロックされてAレコードを待機しています。

ロックの確保方法予期せずにリリースされました。ロック・タイムアウトより長く実行される可能性がある長期実行プロセスがある場合は、実行中にロックをリフレッシュするようにしてください。

「明示的ロック」という用語は、このロック時間を表すためにも使用されます。

+0

+1素晴らしい回答、ありがとうございます。より多くの反応を奨励するために、24時間未回答の質問を残しておきます。 –

+0

ブラウザを開いたまま昼食/休暇に行く人には注意してください。ユーザーや管理者が他のユーザーのロックを解除するために何らかのUIが必要かどうかを検討します。 (経験から言えば) –

1

私はこれを手動で行っています。

  • レコードのプライマリキーをロックテーブルに格納し、編集するレコードに というマークを付けます。
  • 別のユーザーがこのレコードを選択しようとすると、ユーザーの 準備完了レコードを示します。
  • レコードをロックするための最大セットアップ時間があります。
  • ロックされたレコードのページデータを更新します。ユーザーは を変更することができますが、他のすべてのユーザーは変更を許可されます。

    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年前にクライアントの特別なリクエストで実装したアイデアです。そのクライアントの後、誰も私にもう一度同様のことをするように頼んだことはないので、私は他の方法を達成していません。

関連する問題