我有一个SQL Server 2008数据库和一个asp.net前端。
当用户当前正在编辑记录但不确定哪种是最好的方法时,我想实现一个锁定。
我的想法是isLocked为记录创建一列,并在用户拉出该记录时将其设置为true,这意味着所有其他用户都具有只读访问权限,直到第一个用户完成编辑为止。
isLocked
但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留为isLocked = true,表示其他人无法对其进行编辑,对吗?
isLocked = true
如何实现某种类型的会话超时,并isLocked在会话超时时(或在预定义的时间段之后)自动设置为false
应该在asp.net端还是在SQL端实现?
完全不做。请改用开放式并发。
悲观锁定是可能的,但不能从.Net应用程序锁定。.Net应用程序场在技术上不能保持长期存在的会话来保持锁定(通过sp_getapplock或更糟的是通过真实数据锁定获得),因为.Net应用程序场:
sp_getapplock
在您说“我没有服务器场,只有一台IIS服务器”之前,我会指出您 现在 可能只有一台IIS服务器,如果您依靠它,您将永远无法扩展,而您 仍然 可以应用程序域回收的问题。
通过应用程序特定的更新(例如,“ is_locked”字段)模拟锁定在实际使用中存在严重缺陷,这是您已经开始看到的原因以及更多其他原因。当推来推这是唯一的方法 可以 工作进行,但我从来没有听说过的 人 说:“哎呀,我真的很高兴我们实现了数据的写入悲观锁定!”。从来没有人
由于完全相同的原因,应用程序层锁定也不起作用。.Net服务器场无法使用后端锁定(负载平衡,调用之间缺少上下文,应用程序域回收)。编写分布式锁定应用程序协议只是行不通,这条道路铺满了车身。
只是不要这样做。乐观并发在各个方面都好得多。