Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MsSql Url缩短器数据库冲突原子性故障_Sql Server_Atomicity - Fatal编程技术网

Sql server MsSql Url缩短器数据库冲突原子性故障

Sql server MsSql Url缩短器数据库冲突原子性故障,sql-server,atomicity,Sql Server,Atomicity,我有一个链接缩短服务,数据库中有大量的密钥,这些密钥在一段时间后过期,然后可以重新分配 我最近开始遇到很多冲突,所以我做了一些修正,在桌面上创建了一个锁,不幸的是,我刚刚发生了一次冲突,两个领先优势同时创建到千分之一秒 我想知道是否有人对我如何回避这个问题有任何想法,我无法想象这还会持续几周,但随着业务的增长,这将使问题变得更加严重 该列不是唯一的,因为我们保留了在系统中创建的每个url的记录,所以url键在表中被多次使用 代码如下所示: BEGIN TRAN GetNextUrlToAssig

我有一个链接缩短服务,数据库中有大量的密钥,这些密钥在一段时间后过期,然后可以重新分配

我最近开始遇到很多冲突,所以我做了一些修正,在桌面上创建了一个锁,不幸的是,我刚刚发生了一次冲突,两个领先优势同时创建到千分之一秒

我想知道是否有人对我如何回避这个问题有任何想法,我无法想象这还会持续几周,但随着业务的增长,这将使问题变得更加严重

该列不是唯一的,因为我们保留了在系统中创建的每个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

已经有一段时间了,但这个问题又出现了,并开始在我的数据库上创建锁

在与另一位开发人员交谈后,他告诉我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或类似的东西?