spring - 如何防止两个用户编辑数据库中的一行

标签 spring hibernate zk

我正在使用 Spring/Hibernate/ZK。在一个选项卡中,我从数据库获取对象以供用户编辑,但第二个用户可以打开相同的选项卡和相同的对象进行编辑。我想通知第二个用户诸如“此对象已打开”之类的消息,并隐藏保存按钮。因此第二个用户可以看到从数据库到此对象的当前数据,但无法编辑他。有没有办法检查此 session 对象或其他方法来做到这一点。

最佳答案

其他答案主要关注数据库,但如果所有用户都使用相同的 zk 应用程序来访问数据库,您可以跟踪 ComposerViewModel 中打开的对象code> (取决于您使用 MVC 还是 MVVM;我将其称为 Controller )。

您的 Controller 需要当前修改的对象的静态列表。如果用户请求打开不在列表中的对象,则一切正常,您的 Controller 将启用字段和保存按钮。否则,这些将被禁用和/或您会显示一条消息。

棘手的部分是从该列表中清除对象。如果用户按下保存按钮,您只需从列表中删除该对象。但是,如果用户不这样做,只是关闭选项卡或者 session 超时怎么办?在这种情况下,您需要一个回调,或者一种定期检查屏幕是否仍然打开的机制。

您可以通过向选项卡添加一个 zk 计时器来实现此目的,该计时器时不时地执行 ping 操作并更新静态列表中的时间戳(因此将其设为 map )。如果新用户尝试编辑对象,请检查最后一个时间戳的历史。如果它足够旧(即之前的用户保存了它或放弃了屏幕),请允许他们编辑它。

不过,您必须考虑如果用户只是保持屏幕打开状态该怎么办。他们可以将对象的锁保留多长时间?这也是 Microsoft Office 中的一个问题。如果多个用户尝试从网络位置打开 Excel 文件,第一个用户将被锁定,其他用户将无法保存,直到该用户保存为止。

关于spring - 如何防止两个用户编辑数据库中的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44581871/

相关文章:

java - 如何为 tomcat web 应用程序实现控制台命令行?

java - Hibernate:在不同模块中启用首次提交获胜和最后提交获胜

java - 如何将更新的实体与旧实体进行比较并仅将更新的值存储在数据库中

hibernate - 使用正则表达式语句在 hibernate 中使用 createSQLQuery 获取计数(*)

java - ZK Wire 组件在 @command 方法 (MVVM) 中不可访问或 View 模型不可访问 (dAft Compose MVC)

java - 使用 mvvm 时从 Zk 中的嵌套类向父类发送通知

spring - Autowiring LinkedBlockingQueue 时出现空指针异常

java - 企业级应用程序中的事务

java - 缺少 Artifact org.springframework :spring-context:jar:${org. springframework-version}

mvvm - 在 ZK 框架中使用 MVVM 的奇怪复选框行为