我正在使用SQL Server,并且有一个可由多线程访问的查询。为了从每个线程返回唯一的行,我有这个查询
DECLARE @Guid uniqueidentifier = NEWID();
-- update first to lock what to get
UPDATE [olp].[VendorTaskQueue]
SET VendorTaskStatusId = 20 -- processing
, [Guid] = @Guid
WHERE VendorTaskQueueId IN (
SELECT TOP (@BatchSize) VendorTaskQueueId
FROM [olp].[VendorTaskQueue]
WHERE VendorTaskId = @VendorTaskId
AND VendorTaskStatusId = 10
AND [Guid] IS NULL
ORDER BY VendorTaskQueueId
)
-- only need to return these fields
SELECT [VendorTaskQueueId]
,[MessageQueueId]
FROM [olp].[VendorTaskQueue]
WHERE [Guid] = @Guid
AND VendorTaskStatusId = 20
为了更新@BatchSize行,有一个WHERE子句。在上述情况下,SELECT子查询使用相同的表,因此我认为当多线程访问它时,它不会引起任何问题。但是,如果此子查询使用另一个表怎么办:
DECLARE @Guid uniqueidentifier = NEWID();
-- update first to lock what to get
UPDATE [olp].[VendorTaskQueue]
SET VendorTaskStatusId = 20 -- processing
, [Guid] = @Guid
WHERE VendorTaskQueueId IN (
SELECT TOP (@BatchSize) VendorTaskQueueId
FROM [olp].[*** Another table]
WHERE VendorTaskId = @VendorTaskId
AND VendorTaskStatusId = 10
AND [Guid] IS NULL
ORDER BY VendorTaskQueueId
)
......
我的问题是:由于它是UPDATE,SQL是否会锁定[VendorTaskQueue]和[另一个表]?或者,我们需要显式锁定[另一个表]?
谢谢