2012-04-04 76 views
1

我想使用锁定表进行悲观离线锁定,以防止多个用户在一个工作项目上工作的情况。我正在使用锁表来存储锁定和解锁的活动锁和两个存储过程。这是在SQL Server中使用锁表的好方法吗?

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

我的问题是,这是处理锁一个正确的做法? (对不起,如果这应该已经发布到代码审查,而不是SO)。

+0

我认为这种方法可行。在'caselocks'表中使'CaseId'成为PK可以防止任何竞争条件。你计划锁定和解锁的频率如何?你有没有考虑过这种方法的性能? – 2012-04-04 20:28:55

+0

标准SQL固有锁定有什么问题?这种方法存在的问题是,如果程序在打开记录之前破坏或停止或被杀死或发生了什么,会发生什么? – Rodolfo 2012-04-04 20:31:57

+0

当用户完成他或她编辑的项目时,锁将被删除。 (当应用程序崩溃时,预定作业将清除锁定)。关于性能,我不知道该如何执行。有没有更有效率的方法呢? – norbip 2012-04-04 20:33:59

回答

1

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

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

+0

代理无法删除锁,当代理尝试在编辑模式下打开工作项时,锁定和解锁由应用程序管理。感谢UTC使用和返回建议。 – norbip 2012-04-04 20:47:11

相关问题