1

我有以下表格(非常简化):

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 语句?

4

1 回答 1

0

首先,如果您想要 Azure 中的队列,请使用Azure Queues 或 Service Bus Queues

如果您坚持在关系上实现队列,请使用Using Tables as Queues中的模式。具体来说:

  • 不要使用状态字段而不是事件队列(“就绪”是作业队列中的记录,是事件而不是作业的状态)。
  • 出队使用DELETE ... WITH OUTPUT ...

相信我这个。

于 2013-01-10T12:43:42.817 回答