锁定数据库记录以进行编辑

sd_*_*ula 0 sql asp.net locking

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

我想在用户当前正在编辑记录时实现锁定但不确定哪种方法是最佳方法.

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

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

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

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

Rem*_*anu 6

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

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

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

在您说'我没有一个服务器场,只有一个IIS服务器'之前,我会指出您现在可能只有一台IIS服务器,如果您依赖它,您将永远无法扩展,并且您仍然拥有app-domain回收的问题.

通过应用程序特定更新(例如'is_locked'字段)模拟锁定在实际使用中存在严重缺陷,原因是您已经开始查看,还有更多.当推动推动这是唯一可以使用的方法,但我从来没有听说有人说'哎呀,我真的很高兴我们用数据写入实现悲观锁定!'.没有人,永远.

由于完全相同的原因,应用程序层锁定也不可行.Net场不能使用后端锁定(负载平衡,调用之间缺少上下文,app-domain recycle).编写分布式锁定应用程序协议是行不通的,那条道路是用实体铺设的.

只是不要这样做.乐观的并发性在各方面都要好得多.