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

时间:2013-10-17 13:46:03

标签: java hibernate java-ee jpa transactions

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

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

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

  • 应用程序使用Java Web-start技术,该技术与在Tomcat7上运行的Servlet进行通信。
  • DB是SQL Server 2012。
  • 服务器计算机:Windows 64位2008 R2企业服务器。
  • Java 7更新25 64位
  • Hibernate版本 - 3.0

有没有办法实现这个?

请提供建议。

提前致谢

3 个答案:

答案 0 :(得分:1)

这听起来像optimistic strategy的经典案例,例如

  

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

也许保留记录版本号。

e.g。每条记录都会保留一个记录版本号。当客户端收到客户端时,它也会收到版本号。修改后,服务器会将记录号与数据库中的记录号进行比较,如果更改,则会使用增加的版本号写入新记录。

然后第二个客户端将使用相同的记录号(即两个客户端正在更新记录)。这次服务器会识别版本号已更改,并拒绝更新。

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

答案 1 :(得分:1)

通常由数据库处理防止“丢失更新”等数据异常。为此,它使用对使用数据库的应用程序透明的锁定机制。只要您正确使用事务概念,它就应该工作。有许多不同的锁定概念会影响性能以及防止数据异常。我不是数据库管理员,但这应该是可配置的。

答案 2 :(得分:0)

当一个实体加载到一个请求中并保存在另一个请求中时,数据库事务的ACID properties在多请求对话中不会阻止lost updates

对于long conversations,您需要implicit optimistic locking机制和显式锁: