Sql server MsSql Url缩短器数据库冲突原子性故障
我有一个链接缩短服务,数据库中有大量的密钥,这些密钥在一段时间后过期,然后可以重新分配 我最近开始遇到很多冲突,所以我做了一些修正,在桌面上创建了一个锁,不幸的是,我刚刚发生了一次冲突,两个领先优势同时创建到千分之一秒 我想知道是否有人对我如何回避这个问题有任何想法,我无法想象这还会持续几周,但随着业务的增长,这将使问题变得更加严重 该列不是唯一的,因为我们保留了在系统中创建的每个url的记录,所以url键在表中被多次使用 代码如下所示:Sql server MsSql Url缩短器数据库冲突原子性故障,sql-server,atomicity,Sql Server,Atomicity,我有一个链接缩短服务,数据库中有大量的密钥,这些密钥在一段时间后过期,然后可以重新分配 我最近开始遇到很多冲突,所以我做了一些修正,在桌面上创建了一个锁,不幸的是,我刚刚发生了一次冲突,两个领先优势同时创建到千分之一秒 我想知道是否有人对我如何回避这个问题有任何想法,我无法想象这还会持续几周,但随着业务的增长,这将使问题变得更加严重 该列不是唯一的,因为我们保留了在系统中创建的每个url的记录,所以url键在表中被多次使用 代码如下所示: BEGIN TRAN GetNextUrlToAssig
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
已经有一段时间了,但这个问题又出现了,并开始在我的数据库上创建锁 在与另一位开发人员交谈后,他告诉我MsSql不应该真正用作队列。有用于创建队列的特定软件: 没有任何经验,但从一个简短的阅读他们似乎是技术使用 但是,我仍然需要解决我的问题,即查询速度慢和锁定数据库,一些查询正在生成,最慢的查询需要30秒才能完成 我的解决方案是构建第二个表,其中包含来自主表的1000行,存储过程确保每五分钟完全填充一次表 聪明的部分来自于使用事务和锁提示UPDLOCK和READPAST UPDLOCK为您提供了一个对该行的锁定,readpass允许下一个请求读取下一行,如下面的示例所示。您需要对正在使用的列建立索引 这个解决方案给了我一个相当高性能的查询,在开发过程中,我在两秒钟内测试了三个客户端上的大约150个链接
BEGIN TRAN GetNextUrlToAssign
SELECT TOP 1 @OldID = q.ID, @URLKey = q.URLKey
FROM Queue q WITH (UPDLOCK, READPAST)
WHERE q.Deleted = 0
AND q.DateReallocated IS NULL
UPDATE Queue
SET Deleted = 1
WHERE ID = @OldID
COMMIT TRAN GetNextUrlToAssign
要进一步阅读,请尝试本文:
你找到解决这个问题的办法了吗?很抱歉,我没有及时回复。我现在认为url缩短器在这种情况下不起作用。我会考虑使用散列算法不确定哪一个,但你可以把日期时间链接链接到ASUI2EK或类似的东西?