繁体   English   中英

SQL Server 2008 Express锁定

[英]SQL Server 2008 Express locking

好的,所以我已经阅读了很多有关SQL Server锁定的内容,但是我正努力理解所有这些内容。

因此,我想要实现的是:

我需要能够在用户A SELECT时锁定行

如果用户B随后尝试选择它,则我的winforms .net应用程序需要将相关表单上的所有控件都设置为禁用,因此用户无法尝试更新。 如果我可以为用户B抛出一个消息框,说明用户A是使用该行的人,那也很好。

因此,基本上,用户B需要能够选择数据,但是当他们这样做时,他们还应该获得a)记录是否被锁定以及b)谁被锁定。

我知道人们会说我应该让SQL Server处理锁定,但是我需要用户B在选择记录后立即知道该记录正在使用中,而不是找出何时更新-到那时他们可以在表格中输入了数据,这给我带来了不一致。

同样,任何锁都需要允许SELECT仍然发生-因此,当用户B执行其SELECT时,他不仅应该获得数据并能够查看它,而不仅仅是抛出异常并接收不/不完整的数据,而不仅仅是能够更新它。

我猜这是很基本的东西,但是SQL Server锁定涉及很多术语,我不熟悉,这使得当前很难阅读。

谢谢

要创建这种类型的“应用程序锁定”,您可能需要使用一个名为Locks的表,并在其中插入键,用户ID和表名。

出现选择时,请加入Locks表并使用此值的存在来表示记录已被锁定。

我还建议您在要保护的表中添加“ RowVersion”列。 此字段将有助于识别您是要更新还是查询自上次选择以来已更改的行。

这并不是SQL Server锁定的真正目的-理想情况下,您只应保持事务(以及锁)的打开状态,以完成针对该数据库的原子操作所需的绝对最低限度-您当然不应在保持锁的同时等待用户输入。

通过(例如)在表中添加一个locked位列以及一个locked_by varchar列来跟踪谁已锁定行,可以更好地自己跟踪这些类型的锁。

第一个用户应UPDATE该行以指示该行已被锁定以及被谁锁定:

UPDATE MyTable 
SET `locked`  = 1
AND `locked_by` = @me
WHERE `locked` = 0

locked = 0校验用于防止潜在的比赛情况,并确保您不更新别人已经锁定的记录。

然后,第一个用户执行SELECT来返回数据,并确保他们确实设法锁定了该行。

暂无
暂无

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

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