在ASP.NET中存储记录锁定令牌

时间:2009-11-16 14:37:05

标签: asp.net asp.net-mvc concurrency record-locking

在我正在处理的应用程序中,多个用户可能希望同时编辑某些内容,这意味着我们需要实现乐观锁定。但是,对于此应用程序,正在编辑的项目是一种科学协议,其中包含来自数据库中多个不同表的记录。

因此,我们希望能够指示整个协议已被锁定以供单个用户编辑,这导致了我的问题:这样做的首选方法是在数据库级别对事件进行编辑(例如,一个具有协议唯一ID的表,并检查它是否已被锁定)或是否可以接受在内存中跟踪Web服务器本身上当前锁定的协议?

目前我们只预计应用程序的大约100个用户(同时大约20个),但是这个数字可能会在未来增加,因此我们希望使用最具扩展性的选项。

3 个答案:

答案 0 :(得分:5)

这个问题也取决于你的代码库的架构有多好?

如果修改这些记录的所有调用都是通过单个入口点进行的,那么我建议将所有锁定代码完全保留在应用程序中,这样您就可以将数据库保存为哑数据存储。

如果您有多个可以修改表的入口点,则需要在数据库级别实现锁定。

答案 1 :(得分:3)

我会在数据库中实现一个管理锁定的表。例如:

行:ProtocolID,EditingBeginDate,EditingEndDate

然后,您可以简单地查询何时尝试应用程序中的编辑功能,如果给定的协议没有完成的时间范围,那么您知道它仍然由给定用户编辑。您可以实施特定时间段来关闭编辑会话,以防止记录被永久锁定。只是一个建议:-D

答案 2 :(得分:2)

所以,你似乎需要粗粒锁。

如果您想拥有最具可伸缩性的解决方案,则需要将锁定信息保存在数据库或分布式缓存中(在这种情况下,分布式缓存会更快)。内存中的方法根本不可扩展 - 如果您需要更多服务器,它将会失败。 不要忘记引入锁定超时以防止可能的死锁。