次の表があります(大幅に簡略化されています):
Jobs: JobId, JobState
Data: DataId
JobsData: JobId, DataId
のJobsData任意のアイテムDataを の 1 つまたは複数のアイテムに関連付けることができJobs、 の各アイテムに のJobs1 つまたは複数のアイテムをData関連付けることができます。
今、私は2つのトランザクションを持っています:
-- TRAN1
BEGIN TRAN
INSERT INTO Data VALUES (NewDataId)
INSERT INTO Jobs VALUES (NewJobId, StateInitial)
INSERT INTO JobsData VALUES (NewDataId, NewJobId)
UPDATE Jobs SET JobState=StateReady WHERE JobId=NewJobId
COMMIT TRAN
-- TRAN2
DECLARE @selectedId;
SELECT TOP (1) @selectedId=JobId FROM Jobs WITH (UPDLOCK, READPAST) WHERE JobState=StateReady
IF @selectedId IS NOT NULL
SELECT DataId FROM JobsData WHERE JobId = @selectedId
ロックのヒントを含むコードは、この回答から来ています。その目的は、複数のTRAN2インスタンスを並行して実行し、決して同じものを取得しないようにすることJobIdです。
そのコードは SQL Server (既定の分離レベルREAD_COMMITTED) では正常に動作していますが、SQL Azure ではTRAN2正しく動作しないことがありSELECTます。これは、SQL Azure の既定の分離レベルが.JobIdSELECTREAD_COMMITTED_SNAPSHOT
問題を解決するために最小限の変更を行いたいのでTRAN2、最初に null を取得するかSELECT、2 番目に正しい結果セットを取得しますSELECT。
どのテーブル ヒットをどの SQL ステートメントに適用するか?