次の表があります(大幅に簡略化されています):
Jobs: JobId, JobState
Data: DataId
JobsData: JobId, DataId
のJobsData
任意のアイテムData
を の 1 つまたは複数のアイテムに関連付けることができJobs
、 の各アイテムに のJobs
1 つまたは複数のアイテムを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 の既定の分離レベルが.JobId
SELECT
READ_COMMITTED_SNAPSHOT
問題を解決するために最小限の変更を行いたいのでTRAN2
、最初に null を取得するかSELECT
、2 番目に正しい結果セットを取得しますSELECT
。
どのテーブル ヒットをどの SQL ステートメントに適用するか?