blazor 上有一个水疗应用程序。如果有人已经在编辑此元素,则需要为其他用户阻止该元素并通知他们。目前有一个想法:
- 将列 LockedUserId(由谁)和 LockedTime(何时)添加到实体表。将锁定时间存储在项目配置中。
- 加载页面时,用户订阅 hub(signalr) 并特别订阅通知阻塞及其取消的方法。
- 如果用户打开元素进行编辑,那么除了 post 方法之外,他还调用了阻塞 signalr 方法。Signalr 向所有人发送阻止通知。
- 成功编辑/取消后,用户可能会或可能不会调用所需的 api,但在任何一种情况下都会调用 signalr 方法来释放锁。
- 如果与用户的连接丢失或用户重新加载页面,则调用 OnDisconnected 信号器方法并解锁被阻止的实体,并向所有其他用户发送关于释放锁的通知。
这个解决方案是最优的吗?
您正在尝试提出一种处理悲观锁的机制,今天的行业共识是应该避免这种设计。所以你的问题的答案是否定的,它不是最优的。在您的情况下,它通常是这样工作的: