2011-12-06 18 views
0

Webサービスが呼び出され、リスト内の次の番号が生成されるという要件があります。読み取り時のテーブルのロック

複数のクライアントがあり、次の番号を取得しているクライアントのレコードだけをテーブル全体にロックしたくありません。各クライアントには独自の番号システムがあります。

しかし、新しい番号を生成して保存して返すことができるように、特定のレコードの読み取り時にテーブルをロックする必要があります。

私はリスト全体をメモリにロードし、そこに変更を加え、単純にエンキューとデキューを使用してリクエストをスタックすることを考えていましたが、これはクライアント中心ではありません。リクエストが少なくなるため、一日の終わりには問題ではありません。

データアクセスには、Entity FrameworkとLINQが使用されています。

私は主な質問として読んでロックするために使用するかもしれないアプローチは何かと思います。

+0

は、SQLサーバーを想定することは安全ですか、あなたは他のバックエンドをサポートする必要がありますか? –

+0

ええSQLサーバー – griegs

答えて

3

SQL Serverを使用していると仮定して、これを処理する方法は、SELECTステートメントのUPDLOCKテーブルヒントを使用してSQLクエリを実行することです。

我々は通常、我々は次のレコード番号(ない私達のデータベース設計)を取得しているのインサートでこれを使用します。

INSERT 
    INTO TableName (RecordNumber) 
SELECT ISNULL(MAX(RecordNumber, 0) + 1 
    FROM TableName WITH (UPDLOCK) 
+0

+1これは競争状態を避けるために非常にクリーンな方法です。 –

+0

+1、私はこれが好きで、私に行く方法のように思える – griegs

+0

偉大な、ありがとうございます。 – griegs

関連する問題