0

以前は単一インスタンス アプリケーションとして機能していた C# アプリケーションを開発しています。ここで、マルチユーザー アプリケーションに変更する必要があります。つまり、単一の MS SQL Server 2008 R2 データ ストアにアクセスしながら、GUI フロントエンドが複数のワークステーションで実行されます。

このアプリケーションが管理する作業の一部はキュー ベースです。つまり、各ユーザーが次に使用可能な作業項目を「取得」できる作業項目のプール (作業項目のリストは単一の SQL テーブルにあります) があります。私が達成したいことは次のとおりです。

  • ワークアイテムがユーザーによって「取得」されると、最初のユーザーが作業を完了するまで、他のユーザーはどのような方法でも (読み取りを含む) アクセスできません。
  • タイムアウト (ワークアイテムの取得中にユーザーが週末に家に帰る) とフリーズしたクライアント (ワークアイテムの取得中にステーションでリセットボタンが押される) を処理します。

私はこれがかなり一般的な質問であることを知っています(むしろ研究です)ので、詳細な解決策は期待していませんが、この件について読むための有用なリンク、ベストプラクティス、および/またはいくつかの文献を期待しています. 私はどこから始めればよいのか完全に迷っているので、どんな助けも本当に感謝しています。

4

1 に答える 1

3

トランザクション リソース ロック テーブルまたは列でこれが行われるのを見てきました。たとえば、レコードを誰かに割り当てる (ユーザー ID を設定するか、その他のメカニズムによって) と同時に、そのリソースがいつロックされたかに関するタイムスタンプ付きのレコードを設定します。データにアクセスするときは、クエリを実行する場合でも、更新しようとしている場合でも、まずこのロック テーブル/列をチェックして、それが使用可能であることを確認します。そうでない場合は、変更を適用しません。

これはタイムアウトもサポートします。タイムスタンプが古すぎる場合、ロックは解除されます。タイムスタンプが古すぎる場合は自動的にリリースを想定するか、期限切れのロックをチェックしてロックを解除するスケジュールされたサービスを作成できます。ロックが存在するかどうかをチェックする方がコストがかからないため、2番目の方法をお勧めします(行のブール論理が存在するか、フィールド値が存在するか[つまり、nullではない])。しかし、私はそれが両方の方法で行われるのを見てきました。

于 2013-01-30T16:08:22.240 に答える