2011-02-07 8 views
0

私はいくつか似たような質問を見ましたが、このシナリオには全く触れていません。並行読み取りと書き込みアクセスを持つテーブルのロックヒント

私はオンライン評価アプリケーションを使用して、ユーザーに1ページあたり1つの質問を提示し、回答を記録します。ユーザーは質問間を移動でき、回答は自動的に保存されます。別のページ(質問Q1)から(質問Q2)をナビゲートし、データベースをしなければならない

  • UPDATE Q1にこのユーザーの応答(存在する場合)、またはQ1に対する応答を挿入します。
  • Q2(存在する場合)にこのユーザーの応答を選択して、ページにデータを入力します。

[レスポンス]テーブルは、多数のユーザーが同時に読み書きするという競合のポイントです。ただし、各ユーザーは、自分自身の行を読み取って、に書き込みます。

これは私が(READUNCOMMITTED) とUPDATEを(NOLOCK) と安全に使うことができると考えています。私の心配は、ユーザーがページを進んでジャンプして、更新前の古いデータを取得する状況を望んでいないことです。私は2つの操作をトランザクション内に置くことができますが、NOLOCKヒントを使用している場合は何か違いがありますか?

このテーブルの競合を緩和するために使用できるロック方法は何ですか?

現在、SQL2000を使用しています。

+0

同じユーザーの同時ログインを防止するサイトのセキュリティが設定されていますか?ロックヒントに問題があるかもしれません... – JNK

+1

"UPDATE with(NOLOCK)"とはどういう意味ですか?更新は常にロックを取ります。 'NOLOCK'は' SELECT'クエリにのみ適用されます。 –

+0

@JNK:はい、同じユーザーIDは1度だけログインします。 –

答えて

2

rowlockヒントを使用して、異なるユーザーに属する他の行をスキャンせずに行を直接検索できる適切なインデックスがあることを確認してください。

+0

書かれている行だけがロックされるので、NOLOCKでSELECTする必要はありません。他のユーザーの行に対する行ロックは、適切なインデックス(userID上)がある限り、選択に影響しません。 –

+0

@GC - はい。彼らが行の異なるセットで行ロックを取っている限り、問題はないはずです(並行更新のページラッチには多少の競合があるかもしれませんが、おそらくそれを心配する価値はありません)。By the Way SQLプロファイラあなたのクエリで取られたロックを追跡します。 –