我想使用锁定表进行悲观的脱机锁定,以防止多个用户处理一个工作项时的情况。我正在使用锁表来存储活动锁和两个用于锁定和解锁的存储过程。
我的锁表的结构如下:CaseId(PK)| UserId | LockValidTo。
对于锁定和解锁,我编写了两个存储过程,一个用于锁定,另一个用于解锁。
这是我的锁存存储过程:
BEGIN
BEGIN TRY
INSERT INTO scs.dbo.caselocks VALUES (@caseId, @agentId, dateadd(n, @lockTime, getdate()) )
SELECT 0
END TRY
BEGIN CATCH
SELECT 1
END CATCH
END
这是为了删除锁:
BEGIN
BEGIN TRY
DELETE FROM scs.dbo.caselocks
WHERE caseid = @caseid
SELECT 0
END TRY
BEGIN CATCH
SELECT 1
END CATCH
END
我的问题是,这是处理锁的正确方法吗? (对不起,如果这应该发布到Code Review而不是SO。)
答案 0 :(得分:1)
对于删除SP,您是否允许任何代理删除锁定?另外,为什么要使用“SELECT”从SP返回ResultSet?你可以使用RETURN语句。
我看到您正在使用getdate()函数在本地时区中保留一段时间。当您处理多个时区,切换到/来自夏令时等时,这通常会导致问题。最佳做法是每当您保留日期/时间时始终使用UTC时间,并且只在时间转换为当地时间显示给用户。