我有很多对象,如 Pg、Layout、SitePart 等,多个用户可以编辑这些对象并将它们保存回数据库。但是,一次只有一个用户可以将更改保存到 DB,如果两个用户都在更新相同的对象,则让其他用户等到该成员完成他的工作。
我有构建对象并将它们保存到数据库的功能。但是如何实现这种锁定,其他用户将如何知道对象何时被释放。
请就如何进行。
先感谢您..
我有很多对象,如 Pg、Layout、SitePart 等,多个用户可以编辑这些对象并将它们保存回数据库。但是,一次只有一个用户可以将更改保存到 DB,如果两个用户都在更新相同的对象,则让其他用户等到该成员完成他的工作。
我有构建对象并将它们保存到数据库的功能。但是如何实现这种锁定,其他用户将如何知道对象何时被释放。
请就如何进行。
先感谢您..
您所描述的行为类型称为悲观并发。您还没有说是否需要将此锁锁定在单个 Web 请求或多个请求中。与其重新发明轮子,不如使用标准的并发技术,并阅读如何为.net实现这些技术。
通常 Web 应用程序使用乐观并发;如果您需要悲观的并发,它会很快变得非常困难。ASP.NET 不提供对悲观并发的开箱即用支持。
您尚未说明如何访问数据库(例如,如果您使用 ADO.NET 或 EF),但 EF也有并发控制。最终,它归结为使用事务对象,例如SqlTransaction
协调跨表的更新,能够检查其他用户是否在更新之前击败了你,如果他们这样做了,然后决定做什么。
对于悲观的并发,你有更多的事情要担心——把你的全局锁放在哪里(例如在代码中)如果出错会发生什么(例如在 IIS 中回收应用程序池可能意味着两个用户不会锁定同一个如果您的锁在基于代码的单例中,则对象)以及如果您在数据库中记录锁,如何处理超时。如果您想查看与悲观并发相关的另一个 SO 问题,请参阅:如何在 asp.net 应用程序中实现“悲观锁定”?
编辑. 我还应该提到,如果您已经在构建用于构建对象并将它们保存到数据库的逻辑,那么您应该了解存储库和工作单元模式。如果没有,那么您也应该阅读这些内容。您正在解决一个标准问题,该问题具有在大多数语言中实现这些解决方案的标准模式。