我有一个 SQL Server 2008 数据库和一个 asp.net 前端。
我想在用户当前正在编辑记录但不确定哪种方法是最佳方法时实现锁定。
我的想法是有一个isLocked
记录的列,当用户拉出该记录时,它会设置为 true,这意味着所有其他用户都具有只读访问权限,直到第一个用户完成编辑。
但是,如果会话超时并且他/她从未保存/更新记录怎么办,记录将保留isLocked = true
,这意味着其他人无法编辑它,对吗?
我怎样才能实现某种会话超时并有isLocked
当会话超时(或在预定义的时间段后)时自动设置为 false
应该在asp.net端实现还是在SQL端实现?
根本不要这样做。使用乐观并发 http://msdn.microsoft.com/en-us/library/aa0416cz%28v=vs.110%29.aspx反而。
悲观锁定是可能的,但不适用于 .Net 应用程序。 .Net 应用程序场在技术上不具备维持长期会话以保持锁定的能力(通过sp_getapplock http://technet.microsoft.com/en-us/library/ms189823.aspx或者,更糟糕的是,通过实际数据锁定获得),因为 .Net 应用程序农场:
- 跨实例负载均衡请求
- 不要在 HTTP 调用之间保留请求堆栈
- 回收应用程序域
在你说“我没有农场,只有一台 IIS 服务器”之前,我会指出你可能只有一台 IIS 服务器now如果你依赖它,你将永远无法横向扩展,而且你still存在应用程序域回收的问题。
通过应用程序特定更新(例如“is_locked”字段)模拟锁定在实际使用中存在严重缺陷,原因您已经开始看到,还有更多。当事情到了紧要关头时,这是唯一的方法can被要求工作,但我从未听说过anyone说“哎呀,我真的很高兴我们通过数据写入实现了悲观锁定!”。没有人,从来没有。
应用程序层锁定也是行不通的,出于完全相同的原因,.Net 场无法使用后端锁定(负载平衡、调用之间缺乏上下文、应用程序域回收)。编写分布式锁定应用程序协议是行不通的,这条路是由尸体铺成的。
只是不要这样做。乐观并发在各个方面都好得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)