我有一个SQL Server 2008数据库和一个asp.net前端。
我想在用户当前正在编辑记录时实现锁定但不确定哪种方法是最佳方法。
我的想法是为记录设置一个isLocked
列,当用户提取该记录时,它会设置为true,这意味着所有其他用户在第一个用户完成编辑之前都具有只读访问权限。
但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留isLocked = true
,这意味着其他人无法编辑它,对吧?
如何实现某种会话超时,并在会话超时(或在预定义的时间段之后)将isLocked
自动设置为false
这应该在asp.net端还是SQL端实现?
答案 0 :(得分:6)
根本不做。请改用optimistic concurrency。
悲观锁定是可能的,但不是来自.Net应用程序。 .Net应用程序农场在技术上无法维持长期会话以保持锁定(通过sp_getapplock
获得,或者更糟糕的是,通过实际数据锁定获得)因为.Net应用程序场:
在您说“我没有农场”之前,只有一台IIS服务器'我将指出您可能只有一台IIS服务器现在,如果您依赖它,您将永远无法向外扩展,并且您仍然有app的问题 - 域名回收。
通过应用程序特定更新模拟锁定(例如,' is_locked'字段)在实际使用中存在严重缺陷,原因是您已经开始查看,还有更多。当推动推动这是可以工作的唯一方法,但我从来没有听说过任何人说' Gee,我真的很高兴我们用数据写入实现了悲观锁定!'。没有人,永远。
应用程序层锁定也不可行,原因完全相同.Net场不能使用后端锁定(负载平衡,调用之间缺少上下文,app-domain recycle)。编写一个分布式锁定应用程序协议是行不通的,那条道路是用尸体铺设的。
不要这样做。乐观的并发性在各方面都要好得多。