繁体   English   中英

锁定SQL表中的记录

[英]Locking record in sql table

我想在屏幕上打开时锁定sql表中的一行,同时另一个用户打开相同的记录方式,它应该以只读模式打开。

例如:我有一个客户表,我以用户A的身份登录,并且正在编辑客户xyz记录(行),与此同时,另一个用户B登录并试图编辑该记录,但用户B不应编辑该记录。记录(即使页面也不应该为空)。

我该怎么办?

一种方法是使用位字段编辑,然后在编辑记录时将其分配为true。 在应用程序级别,不允许在编辑模式下对记录进行编辑。 您所遇到的问题是有人在编辑中,只是将其留在那里,因此您需要设置超时以清除编辑模式。 并且最好跟踪谁将其置于编辑模式。

我们过去使用的一种产品具有在放置锁时维护的表。 在他们的系统中,主键始终是一个整数。 因此,该表非常简单:会话标识符,表名,行键。 当一个人进入记录时,将运行一个尝试插入锁的过程。 如果该行已经存在,则该人只会得到查看。 否则,将向锁表中添加一行,以授予会话编辑权限。 退出记录后,该行将从锁定表中删除。

如果在未使用适当退出机制的情况下关闭了应用程序(他们必须单击屏幕上的注销),我们将获得被锁定的记录。 我们编写了一种方法来清除这些锁定行。 我们要求原始开发人员清除有关应用程序终止的会话的所有内容,但无法将其添加。

我会尝试将到期时间放在锁表中,以便可以根据需要清除它。 虽然您不能保证应用程序总是干净退出,但请尝试添加一些内容以清除正常应用程序退出时的所有编辑锁定。

CREATE TABLE Customer
(
Id int,
Name nvarchar(max),
LockedOn DateTime
);


CREATE PROCEDURE dbo.AcquireLock (@customerId int)
AS BEGIN
    Update Customer set LockedOn = GetDate() where Id=@customerId and LockedOn is Null
    select @@ROWCOUNT
END

CREATE PROCEDURE dbo.ReleaseLock (@customerId int)
AS BEGIN
    Update Customer set LockedOn = null where Id=@customerId
    select @@ROWCOUNT
END

并在您的代码中使用它们

if (AcquireLock(customerId) > 0){
    //yes you are editing it.
}
else{
    //It is locked, you can not edit it
}

这样,更新语句应在内部处理悲观的锁定可能情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM