我有许多对象,如Pg,Layout,SitePart等, 多个用户可以编辑这些对象,并可以将它们保存回数据库。 但是,一次只有一个用户可以将更改保存到DB,并让其他用户等到成员完成其工作,如果两者都更新相同的对象。
我具有构建对象并将其保存到DB的功能。 但是,如何实现此锁定,其他用户将如何知道对象何时被释放。
请对如何继续进行思考。
提前谢谢..
答案 0 :(得分:3)
您描述的行为类型称为pessimistic concurrency。您尚未说明是否需要此锁定才能锁定在单个Web请求或多个请求中。您应该使用标准并发技术,而不是重新发明轮子,并在how上阅读implement .net的那些。{
通常,Web应用程序使用乐观并发;如果你需要悲观的并发性,它会很快变得非常困难。 ASP.NET不提供对悲观并发的开箱即用支持。
您还没有说过如何访问数据库(例如,如果您使用的是ADO.NET或EF),而是EF also has concurrency control。最终,它归结为使用诸如SqlTransaction
之类的事务对象来协调表之间的更新,能够检查另一个用户是否打败了您更新,以及他们是否确实做了什么。
对于悲观的并发性,您还需要担心更多 - 在哪里放置全局锁(例如在代码中)如果出现问题会发生什么(例如,在IIS中回收应用程序池可能意味着两个用户不会如果您的锁在基于代码的单例中,则锁定同一对象)如果在数据库中记录锁,则如何处理超时。如果您想查看与悲观并发相关的另一个SO问题,请参阅:How do I implement "pessimistic locking" in an asp.net application?
修改即可。我还应该提到,如果您已经构建了构建对象的逻辑并将它们保存到数据库,那么您应该了解Repository和Unit of Work模式。如果没有,那么你也应该阅读这些内容。您正在解决具有标准patterns to implement those solutions in most languages的标准问题。