3

私はこのようなシナリオを持っています、

私の環境は.Net2.0、VS 2008、Webアプリケーションです

2人のメンバーが同時にアクセスしようとしているときに、レコードをロックする必要があります。

私たちは2つの方法でそれを行うことができます、

  1. フロントエンド(sessionIDを入れ、辞書に一意の番号を記録し、静的変数またはアプリケーション変数として保持する)により、投稿ボタンがクリックされた後、応答がそのページから出て、クライアントが接続されていないときに解放します。セッションが終了しました。

  2. バックエンドによる(DB自体のレコードロック-調査する必要があります-私のチームメンバーが探しています)。

他に方法はありますか?また、すべてのステップで他の方法を検討する必要がありますか?

条件がありませんか?

4

3 に答える 3

7

数ミリ秒を超えるレコードをロックすることは、データベースで実行できる最も有害なことであるため、クライアントのレコードをロックしません。代わりに、オプティミスティック同時実行制御を使用する必要があります。最後の読み取り以降にレコードが変更されたかどうかを検出し、トランザクションを再試行します(たとえば、画面をユーザーに再表示します)。これが実際にどのように実装されるかは、使用するDBテクノロジ(ADO.Net、DataSets、Linq、EFなど)によって異なります。

ビジネスドメインでロックのような動作が必要な場合、それらは常にデータベースに予約ロジックとして実装されます。レコードが表示されると、他のユーザーが同じトランザクションを実行できないように「予約」されます。予約が完了するか、タイムアウトするか、キャンセルされます。ただし、「予約」はロックを使用して行われることはなく、常に「使用可能」から「予約済み」への状態の明示的な更新、または同様のものです。

このパターンは、EAA:OptimisticオフラインロックのdinPについても説明しています。

于 2010-07-05T06:07:21.607 に答える
0

SQL Serverデータベースのレコードからデータを読み取るだけの場合は、何もする必要はありません。SQL Serverは、レコードへのマルチアクセスの管理に関するすべてを実行します。ただし、データを操作する場合は、トランザクションを使用する必要があります。

于 2010-07-05T06:19:02.737 に答える
0

私はラムスに同意します。しかし、それでもあなたがそれを必要とするならば。ビットタイプとしてIsInUseのような名前の列を作成し、アクセスしている場合はtrueに設定します。他の人も同時に同じデータを必要とするので、クラッシュからアプリを保存する必要があります。したがって、データが取得されるすべての場所で、IsInUseがFalseであるかどうかを確認する必要があります。

于 2010-07-05T13:31:21.587 に答える