0

我有一个 SQL Server 2008 数据库和一个 asp.net 前端。

当用户当前正在编辑记录但不确定哪个是最佳方法时,我想实施锁定。

我的想法是isLocked为记录设置一个列,并在用户拉出该记录时将其设置为 true,这意味着在第一个用户完成编辑之前,所有其他用户都具有只读访问权限。

但是,如果会话超时并且他/她从不保存/更新记录,记录将保留为isLocked = true,这意味着其他人无法编辑它,对吗?

如何实现某种会话超时并isLocked在会话超时时(或在预定义的时间段之后)自动设置为 false

这应该在 asp.net 端还是 SQL 端实现?

4

1 回答 1

7

根本不要这样做。请改用乐观并发

悲观锁定是可能的,但不能来自 .Net 应用程序。.Net 应用程序场在技术上无法维持长期会话以保持锁定(通过真实数据锁定获得,sp_getapplock或者更糟糕的是,通过真实数据锁定获得),因为 .Net 应用程序场:

  • 跨实例负载均衡请求
  • 不要在 HTTP 调用之间保留请求堆栈
  • 回收应用程序域

在您说“我没有场,只有一台 IIS 服务器”之前,我要指出您现在可能只有一台 IIS 服务器,如果您依赖它,您将永远无法向外扩展,而您仍然拥有应用程序域回收问题。

通过应用程序特定更新(例如“is_locked”字段)模拟锁定在实际使用中存在严重缺陷,原因您已经开始看到等等。当事态严重时,这是唯一可行的方法但我从未听说过有人说“哎呀,我真的很高兴我们通过数据写入实现了悲观锁定!”。没有人,从来没有。

应用层锁定也不可行,原因与 .Net 农场无法使用后端锁定(负载平衡、调用之间缺乏上下文、应用域回收)完全相同。编写分布式锁定应用程序协议是行不通的,那条路是铺满了尸体的。

只是不要这样做。乐观并发在各个方面都好得多。

于 2013-11-05T10:15:52.850 回答