我有以下表格(大大简化):
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
带有锁定提示的代码来自from this answer。其目的是让多个TRAN2
实例并行运行,并且永远不会获得相同的JobId
。
该代码在SQL Server(默认隔离级别READ_COMMITTED
)中运行良好,但在SQL Azure中TRAN2
有时会错误地工作 - 第一个SELECT
产生非空{{1}但是,第二个JobId
会产生空结果集。我假设这是因为SQL Azure中的默认隔离级别是SELECT
。
我想进行最少的更改以解决问题 - 以便READ_COMMITTED_SNAPSHOT
在第一个TRAN2
中检索null,或者在第二个SELECT
中检索正确的结果集。
我将哪些表命中应用于我的哪些SQL语句?
答案 0 :(得分:0)
对于初学者,如果您想在Azure中使用队列,请使用Azure Queues or Service Bus Queues。
如果您坚持在关系上实施队列,请使用Using Tables as Queues中的模式。具体做法是:
DELETE ... WITH OUTPUT ...
相信我这个。