2010-12-06 21 views
2

SQL Server 2008:テーブルから読み込んで特定の条件で行を書きたい場合があります。問題は、別のリクエストがまったく同じ時刻に来て同じことをしたくないということです。私はここで説明しようとするでしょう:SQLクエリ排他読み取り/書き込みテーブル

表名: REQUESTQUEUE

Columns: 

RequestID, StartDate, EndDate, RequestResult 

Sample Data 

1, 12/4/10 1:00pm, 12/4/10 1:02pm, Success 
2, 12/4/10 1:04pm, 12/4/10 1:05pm, Success 
3, 12/4/10 1:00pm, NULL, NULL 

まだのように保留中の要求がある場合は私のアプリでは、ページのロードが、私はそれがこの表を見てみたいとすると(ID#3)それは何もしません。それ以外の場合は、保留中のリクエストがない場合は、IDと開始日を記入した新しい行が作成されます。

問題は、ほとんど同じ時刻にページが2回ロードされる状況に陥る可能性があることです。新しい行が作成される前にテーブルから読み込むと、2つの新しい行が表示されます。私はテーブルから読み込む何らかの並べ替えをしたいと思っています。もし未処理の要求がなければ、StartDateを埋め込んだ新しい行を挿入します。別のページがこのテーブルから読み込む前にすべての方法で実行するようにします私は "二重列"の効果を得ることはありません。

「ロック」などが必要な場合がありますが、私はそれを検索しましたが、私の実際の状況には何かを見つけられませんでした。私はこれが単純なストアドプロシージャであると確信しています。ちょうどここに正しい方向にプッシュする必要があります。

おかげで、あなただけのあなただけ行うことができ、テーブルへのすべての同時アクセスをブロックすると仮定すると、

ロバート

+1

を使用して排他テーブル・ロックを取らずに、特定のプロシージャ内SELECT/INSERTコードへのアクセスをシリアライズだろうか? MySQL、SQL Serverなど? – JNK

+1

RDBMSとバージョンは何ですか?また**テーブルから** **すべての同時読み込みをブロックしたいのですか、または挿入プロセスに無関係に読み込みが許可されているのでしょうか? –

+2

ああ、申し訳ありませんが、SQL Server 2008 – Robert

答えて

2

BEGIN TRAN 

DECLARE @StartDate datetime, 
     @EndDate datetime 

SELECT TOP 1 
      @StartDate = StartDate, 
      @EndDate = EndDate 
     FROM  RequestQueue WITH(TABLOCK,XLOCK) 
     ORDER BY RequestID DESC 


IF @EndDate IS NULL 
    SELECT @StartDate AS 'StartDate' 
ELSE 
    INSERT INTO RequestQueue (StartDate) 
    OUTPUT INSERTED.* /* Or use SCOPE_IDENTITY() instead*/ 
    VALUES (GETDATE()) 

COMMIT 

また、あなたはちょうどあなたが何RDBMSを使用しているsp_getapplock

+0

これは近くにあります。したがって、 "If Not Exists"では、EndDate = NULLの最新の行のみをチェックする必要があります。 (完了したことのない他の行が履歴に残っている可能性があります)また、挿入後にその行の新しいIDを取り消すかどうかを選択できますか?最後に、行が実際に未完成の場合に最新の行のStartDateを返すようにするにはどうすればよいですか?ありがとう – Robert

+0

更新された回答を参照してください。 –

+0

グレートマーティン、ありがとう!ほんとうにありがとう。 – Robert

関連する問題