小编典典

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

sql

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

当用户当前正在编辑记录但不确定哪种是最好的方法时,我想实现一个锁定。

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

但是,如果会话超时并且他/她从不保存/更新记录,该记录将保留为isLocked = true,表示其他人无法对其进行编辑,对吗?

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

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


阅读 203

收藏
2021-04-14

共1个答案

小编典典

完全不做。请改用开放式并发

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

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

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

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

由于完全相同的原因,应用程序层锁定也不起作用。.Net服务器场无法使用后端锁定(负载平衡,调用之间缺少上下文,应用程序域回收)。编写分布式锁定应用程序协议只是行不通,这条道路铺满了车身。

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

2021-04-14