我有以下表格(非常简化):
Jobs: JobId, JobState
Data: DataId
JobsData: JobId, DataId
的想法JobsData
是,任何项目Data
都可以与一个或多个项目相关联,Jobs
并且每个项目都Jobs
可以有一个或多个Data
与之相关联的项目。
现在我有两个交易:
-- 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
产生非 null JobId
,但第二个SELECT
产生和空结果集。我认为这是因为 SQL Azure 中的默认隔离级别是READ_COMMITTED_SNAPSHOT
.
我想进行最少的更改以解决我的问题 - 以便TRAN2
在第一个中检索 nullSELECT
或在第二个中检索正确的结果集SELECT
。
我将哪些表命中应用于我拥有的哪些 SQL 语句?