如何防止使用 Hibernate 的 Java 应用程序中丢失更新?

问题描述 投票:0回答:3

如何防止 Java Web-start 应用程序中丢失更新问题?这种情况是,如果 2 个用户正在访问同一条记录,而一个人只是进行了一些修改并更新了数据库。其他用户仍然拥有旧数据,并且在不知道第一个用户已更改数据的情况下,他进行了一些修改并更新了数据库。这导致第一个用户丢失更新。

我需要确保在保存应用程序之前需要将记录与数据库进行比较,如果发现更改,则需要通知用户,并且我需要以某种方式确保用户在当前用户之后看到更改可以应用他的更改并再次提交给数据库。

以下是我的 Java Web Start 应用程序的详细信息:

  • 应用程序使用 Java Web 启动技术,与 Tomcat7 上运行的 Servlet 进行通信。
  • 数据库是 SQL Server 2012。
  • 服务器计算机:Windows 64 位 2008 R2 Enterprise Server。
  • Java 7 更新 25 64 位
  • 休眠版本 - 3.0

有什么方法可以实现吗?

请多多指教。

提前致谢

java hibernate jakarta-ee jpa transactions
3个回答
2
投票

这听起来像是“乐观策略”的经典案例,例如

乐观并发控制(OCC)是一种并发控制方法 对于关系数据库管理系统来说,假设多个 交易可以在不影响彼此的情况下完成,并且 因此事务可以在不锁定数据资源的情况下继续进行 他们影响。在提交之前,每个事务都会验证没有 其他事务已修改其数据。如果检查显示 冲突的修改,提交事务回滚

也许会保持版本号记录。

例如每条记录都会维护一个记录版本号。当客户端收到客户端时,它也会收到版本号。修改后,服务器会将记录号与数据库中的记录号进行比较,如果

发生更改,则使用递增的版本号写入新记录。 然后,第二个客户端将具有相同的记录号(即两个客户端都正在更新记录)。这次服务器会识别出版本号已更改,并拒绝更新。

请注意,存在各种实施选项。数据库可以使用记录号或时间戳来实现这一点。数据库可以维护编辑历史记录,或者只是记录的最新版本。


1
投票


1
投票
ACID 属性

不会阻止多请求会话中的 更新丢失 对于

长对话

,您需要隐式乐观锁定机制和显式锁:

    乐观_强制_增量
  • 悲观_强制_增量
© www.soinside.com 2019 - 2024. All rights reserved.