1

我想使用锁定表进行悲观离线锁定,以防止多个用户处理一个工作项的情况。我正在使用一个锁表来存储活动锁,并使用两个存储过程来进行锁定和解锁。

我的锁表结构如下: CaseId (PK) | 用户名 | 锁定有效到。

对于锁定和解锁,我编写了两个存储过程,一个用于锁定,一个用于解锁。

这是我的锁定存储过程:

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。)

4

1 回答 1

1

对于删除SP,是否允许任何代理删除锁?另外,为什么要从 SP 中返回带有“SELECT”的 ResultSet?您可以只使用 RETURN 语句。

我看到您正在使用 getdate() 函数在本地时区中保留时间。当您处理多个时区、切换到/从夏令时等时,这通常是导致问题的原因。最佳实践是在您保留日期/时间时始终使用 UTC 时间,并且仅在时间转换为本地时间时显示给用户。

于 2012-04-04T20:40:31.387 回答