我希望任何有经验的人在asp.net应用程序中实现类似"悲观锁定"的建议.这是我正在寻找的行为:
用户A打开订单#313
用户B尝试打开#313订单,但被告知用户A已经将订单专门打开了X分钟.
由于我之前没有实现过这个功能,所以我有一些设计问题:
我应该将哪些数据附加到订单记录中?我在考虑:
LockOwnedBy
LockAcquiredTime
LockRefreshedTime
如果LockRefreshedTime <(现在 - 10分钟),我会考虑解锁记录.
我如何保证锁定的保存时间不超过必要但不会意外到期?
我对jQuery很满意,所以欢迎使用客户端脚本的方法.这将是一个内部Web应用程序,所以我可以相当自由地使用带宽/周期.我也想知道"悲观锁定"是否适合这个概念.
听起来你大部分都在那里.我不认为你真的需要LockRefreshedTime,它并没有真正添加任何东西.你也可以使用LockAcquiredTime来决定锁何时变得陈旧.
您要做的另一件事是确保您使用交易.您需要在数据库事务中包装锁的检查和设置,这样您就不会得到两个认为具有有效锁的用户.
如果您的任务需要在多个资源上获取锁定(即,给定类型的多个记录或多于一种类型的记录),则无论何时进行锁定,都需要以相同的顺序应用锁定.否则你可以有一个死锁,其中一位代码有记录A锁定并且想要锁定记录B而另一位代码已经B锁定并且正在等待记录A.
至于如何确保锁不会意外释放.如果您有任何长时间运行的进程可以运行超过锁定超时,请确保它在运行期间刷新其锁定.
术语"显式锁定"也用于描述锁定时间.