SQL Server的UPDATE会锁定子查询中的表吗?

时间:2019-10-02 18:42:09

标签: sql sql-server sql-update

我正在使用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]和[另一个表]?或者,我们需要显式锁定[另一个表]?

谢谢

0 个答案:

没有答案