题
我想一些建议从任何人经验丰富的与执行类似"悲观锁定"在一个asp.net 应用程序。这是我在寻找:
- 用户打开了#313
- B用户试图打开了#313但被告知用户已经有了开设专门的X分钟。
因为我还没有实现这项功能之前,我有一些设计问题:
- 什么样的数据应附上的顺序记录?我考虑:
- LockOwnedBy
- LockAcquiredTime
- LockRefreshedTime
我会考虑的一个记录锁如果LockRefreshedTime < (现在-10分钟)。
- 我怎么能保证锁不举行超过必要的,但不会过期意外么?
我非常舒适的字样办法,其使用客户端脚本是值得欢迎的。这将是一个内部网络应用程序所以我可以相当自由与我的带宽的使用/循环。我还想知道,如果"悲观锁定"是一个适当的期限为这一概念。
解决方案
这听起来像你们大多数的方式。我不认为你真的需要LockRefreshedTime虽然,它并不真正增加任何东西。你可能只是以使用的LockAcquiredTime决定时锁已经成为陈旧。
其他的事情你会想要做的是确保使用的交易。你需要检查包裹和设置的锁定在数据库内的事务,这样就不会结束与两用户认为他们有一个有效锁。
如果你有任务,需要获得锁上超过一个资源(即多一个记录的类型或多种类型的记录)那么你需要申请锁定在相同的顺序无论你做锁。否则,你可以有一个死的锁,其中一位代码已经记录了被锁是想锁记录B以及另一位代码已B锁,并正在等待记录A。
你如何确保锁不释放的意外。确保如果你有任何长期运行的过程中,可以运行时间比你的超时锁,这刷新其锁在其运行。
术语"明确锁定"也可用于描述的这个时候,锁。
其他提示
我已经这样做了手工。
- 店主键的记录锁表,并标记的记录 模式属性编辑。
- 当另一个用户试图以选择这个记录,表明该用户的 准备好,只记录。
- 有一个建立最大的时间用于锁定的记录。
- 刷新的页面数据对于被锁定的记录。同时,一个允许用户 做出改动,其他所有用户都只允许检查。
锁表应具有的设计类似于这样的:
User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.
剩余的逻辑是你拥有的东西。
这只是一个想法,我实施了4年前,在特殊要求的一个客户。在这之后的客户没有人问我再做任何事情相似,因此我还没有实现任何其他方法。
不隶属于 StackOverflow