2012-01-23 9 views
1

検索はいくつか行っていますが、一般的な状況でなければならないと感じている答えを正確に見つけられておらず、 "ベストプラクティス"パターンソリューションが必要です。SQL Server 2008で1つのupdaterのみを顧客に許可する

SQL Server 2008のバックエンドを使用して.NET 4(C#)で書かれたアプリケーションがあります。私は完全なコントロールを持っており、心配する外部のプロセスやアプリケーションはありません。

基本的に、私は次の操作を実行したい:

誰もが(メインの検索フォームから返された)顧客とその注文を参照できるようにします。

ユーザーが新しい注文を追加したり、見たり編集したりする注文を選択するとすぐに、顧客全体にロックがかけられます。他のユーザーは、顧客および任意の注文を「読み取り専用」することができます。

ユーザーが注文を終了すると、ロックが解除されます(画面を終了するか、アプリからログアウトします)。また、これは難しい部分かもしれませんが、ユーザーがクラッシュした場合はロックが解除されます(おそらく、ロックにはこれを保証するための有限の時間しかありません)。

私はアプリケーションのロックとトランザクションを見ましたが、どちらを使うべきかわかりませんが、それぞれに問題があるようです。

したがって、顧客をロックするためのベストプラクティスと、他のユーザーが他のユーザーによって顧客がロックされていることを知る方法はなんですか?

答えて

1

手作業で行う方法は、テーブルに2つの列を追加することです:boolean LOCKEDとDateTime LAST_LOCKED、ロックされているときにユーザーがロックされて解放されたときに更新する(定期的にLAST_LOCKEDを更新する) 10分、レジストリが10分以上ロックされている場合は、ロックを解除します。

+0

これは、映画/劇場/航空会社のウェブサイトが時間ベースの「ロック」または「予約」で動作する方法と全く同じです – Kane

+0

「ロックレコード」、「レコードのロック解除」および「レコードロックされていますか?コマンドはSQL Serverに組み込まれています。しかし、私はそのようなことはないと思った。次善策は手動の方法で、ロックを取得するユーザーにタイマーを設定することで改善し、30秒ごとに最後のロック時間を更新する必要があります。アプリケーションが1分以上経過したロックを期限切れにすることは完全に安全です。 –

0

アプリケーションロックを管理するのは難しく、トランザクションロックはできるだけ短くする必要があります。 "Locked"と "Last_Locked"カラムについてのアイデアは素晴らしいです。ロックされたレコードの日時に対するフィルタリングされたインデックスを追加して、必要なときにロックを解除し、ロックされた顧客を見つけることができます。

関連する問題