2017-10-31 2 views
1

私のWebアプリケーションは、同じ時間に次のレコードをフェッチすると約300人のユーザーがいます。各ユーザーが異なるレコードを持つようにMSSQL 2012を使用して同時に各ユーザーごとに異なるレコードを選択

また、フェッチされたレコードはフェッチされたものとしてマークして、次のフェッチロットでは考慮しないでください。

次のクエリが私に役立つかどうかわかりません。

SELECT TOP 1 * FROM [Table_name] ORDER BY NEWID(); 
+0

'フェッチされたMyTableからトップ1 *を選択= newid()'によって順序付けして、すでにフェッチされたレコードが表示されないようにします。そして、フェッチされたレコードをフェッチされたものとしてマークする必要があります。 'update myTable set Fetched = 1' – trailmax

+0

返信ありがとうございます。私は – Swapnil

+0

を試してみます。あなたが作業しているレコードのIDを指定する必要があります。現在、このステートメントはテーブル内のすべてのレコードを 'fetched = 1'で更新します。 – trailmax

答えて

0

あなたはORDER BY何かする必要はありません - SQLエンジンは、(たとえば、インデックスを使用して)それ自体で行で注文するだろう - ちょうどTOP 1を使用して:あなたは全体のステートメントをラップすることができます

BEGIN TRAN; 

DECLARE @TableId INT; 

Select top 1 @TableId = TableId 
from MyTable 
where Fetched=0; 

Update myTable 
set Fetched=1 
WHERE TableId = @TableId; 

COMMIT TRAN; 

SELECT * 
FROM myTable 
WHERE TableId = @TableId; 

データベースのレベルをisolationにチェックしてください。ストアドプロシージャの分離レベルも変更できます。

+0

更新中に「ロック有りまたは無し」ステートメントを考慮する必要があります – Swapnil

+0

トランザクション内でステートメント全体をラップすることができます。 – gotqn

関連する問題