我想使用锁定表进行悲观离线锁定,以防止多个用户在一个工作项目上工作的情况。我正在使用锁表来存储锁定和解锁的活动锁和两个存储过程。这是在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)。
我认为这种方法可行。在'caselocks'表中使'CaseId'成为PK可以防止任何竞争条件。你计划锁定和解锁的频率如何?你有没有考虑过这种方法的性能? – 2012-04-04 20:28:55
标准SQL固有锁定有什么问题?这种方法存在的问题是,如果程序在打开记录之前破坏或停止或被杀死或发生了什么,会发生什么? – Rodolfo 2012-04-04 20:31:57
当用户完成他或她编辑的项目时,锁将被删除。 (当应用程序崩溃时,预定作业将清除锁定)。关于性能,我不知道该如何执行。有没有更有效率的方法呢? – norbip 2012-04-04 20:33:59