Sql 使用 CTE 的服务器锁定 - 避免重复处理

Sql Server LOCK with CTE - Avoid duplicate processing

我有一个 table 有数千个交易和多个服务实例,必须一个一个地处理交易。为避免重复处理,我使用一列来阻止服务用户的交易。我在 SELECT 上使用了 TABLOCK 和 XLOCK,但我正在使用 CTE 来阻止。

对我来说一切看起来都不错,但希望专家的意见来验证相同以避免重复处理。按照我的逻辑,两个用户是否有可能在任何给定时间阻止同一笔交易?

CREATE PROCEDURE [dbo].[GetMyTicket] (
    @username VARCHAR(20),
    @id INT OUTPUT)
AS
;WITH result AS (
     SELECT TOP 1 id, trx_user, trx_status 
     FROM dbo.transaction_details t WITH(TABLOCK, XLOCK)
     WHERE t.trx_user IS NULL AND t.trx_status IS NULL
     ORDER BY t.id
)
UPDATE result
SET trx_user = @Username,
    trx_status = 'NEW',
    @id = id
GO

Is there any possibility that two users might block same transaction in any given time in my logic?

没有。只要确保您了解,如果您在事务中 运行 GetMyTicket,在您提交事务之前,其他会话无法 运行 GetMyTicket。

您可以使用 WITH (UPDLOCK, READPAST, ROWLOCK) 获得额外的并发性,请参阅 Using tables as queues, and you can serialize calls to that query with sp_getaplock/sp_releaseapplock 并且在您的事务结束之前不持有独占锁。