我正在使用 Spring/Hibernate/ZK。在一个选项卡中,我从数据库获取对象以供用户编辑,但第二个用户可以打开相同的选项卡和相同的对象进行编辑。我想通知第二个用户诸如“此对象已打开”之类的消息,并隐藏保存按钮。因此第二个用户可以看到从数据库到此对象的当前数据,但无法编辑他。有没有办法检查此 session 对象或其他方法来做到这一点。
最佳答案
其他答案主要关注数据库,但如果所有用户都使用相同的 zk 应用程序来访问数据库,您可以跟踪 Composer
或 ViewModel
中打开的对象code> (取决于您使用 MVC 还是 MVVM;我将其称为 Controller )。
您的 Controller 需要当前修改的对象的静态
列表。如果用户请求打开不在列表中的对象,则一切正常,您的 Controller 将启用字段和保存按钮。否则,这些将被禁用和/或您会显示一条消息。
棘手的部分是从该列表中清除对象。如果用户按下保存按钮,您只需从列表中删除该对象。但是,如果用户不这样做,只是关闭选项卡或者 session 超时怎么办?在这种情况下,您需要一个回调,或者一种定期检查屏幕是否仍然打开的机制。
您可以通过向选项卡添加一个 zk 计时器来实现此目的,该计时器时不时地执行 ping 操作并更新静态列表中的时间戳(因此将其设为 map )。如果新用户尝试编辑对象,请检查最后一个时间戳的历史。如果它足够旧(即之前的用户保存了它或放弃了屏幕),请允许他们编辑它。
不过,您必须考虑如果用户只是保持屏幕打开状态该怎么办。他们可以将对象的锁保留多长时间?这也是 Microsoft Office 中的一个问题。如果多个用户尝试从网络位置打开 Excel 文件,第一个用户将被锁定,其他用户将无法保存,直到该用户保存为止。
关于spring - 如何防止两个用户编辑数据库中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44581871/