这是在SQL Server中使用锁表的好方法吗?

时间:2012-04-04 20:17:47

标签: sql-server sql-server-2008 tsql

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

我的锁表的结构如下: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。)

1 个答案:

答案 0 :(得分:1)

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

我看到您正在使用getdate()函数在本地时区中保留一段时间。当您处理多个时区,切换到/来自夏令时等时,这通常会导致问题。最佳做法是每当您保留日期/时间时始终使用UTC时间,并且只在时间转换为当地时间显示给用户。