我有一个链接缩短服务,数据库中有大量密钥,这些密钥在一定时间后过期,然后可以重新分配。
我最近开始遇到很多冲突,所以做了一些修改以在桌子上创建一个锁,不幸的是我刚刚发生了冲突,同时创建了两个潜在客户(到 1'000 秒)
想知道是否有人对我如何解决这个问题有任何想法,我无法想象它会在几周内发生,但随着业务的增长,这将激怒这个问题。
该列不是唯一的,因为我们保留了系统中创建的每个 url 的记录,因此 url 键在表中被多次使用。
代码如下所示:
BEGIN TRAN GetNextUrlToAssign
DECLARE @res AS INT
EXEC @res = sp_getapplock
@Resource = 'GetKeyForURL',
@LockMode = 'Exclusive',
@LockOwner = 'Transaction',
@LockTimeout = 20000, -- time in milliseconds.
@DbPrincipal = 'public'
IF @res < 0
BEGIN
RAISERROR ( 'psp_GetKeyForURL: Unable to acquire Lock', 16, 1 )
ROLLBACK TRAN GetNextUrlToAssign
--RETURN -1
END
SELECT TOP 1 @OldIMID = IMID, @URLKey = URLKey
FROM IM A WITH (INDEX(IX_DateAvailable) )
WHERE DateAvailable < CURRENT_TIMESTAMP
AND DateReallocated IS NULL
UPDATE IM
SET DateReallocated = GETDATE()
WHERE IMID = @OldIMID
EXEC @res = sp_releaseapplock @Resource = 'GetKeyForURL';
COMMIT TRAN GetNextUrlToAssign