Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止在使用hibernate的Java应用程序中丢失更新?_Java_Hibernate_Jakarta Ee_Jpa_Transactions - Fatal编程技术网

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

如何防止在使用hibernate的Java应用程序中丢失更新?,java,hibernate,jakarta-ee,jpa,transactions,Java,Hibernate,Jakarta Ee,Jpa,Transactions,如何防止Java web start应用程序中的丢失更新问题?这种情况是,如果两个用户正在访问同一条记录,而一个人只是进行一些修改并更新数据库。其他用户仍然拥有旧数据,在不知道第一个用户已经更改了数据的情况下,他进行了一些修改并更新了数据库。这将导致第一个用户的更新丢失 我需要确保在保存应用程序之前,需要将记录与数据库进行比较,如果发现更改,则需要通知用户,并且我需要以某种方式确保用户在当前用户应用更改并再次提交到数据库后看到更改 以下是我的Java web start应用程序的详细信息: 应

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

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

以下是我的Java web start应用程序的详细信息:

  • 应用程序使用JavaWebStart技术,它与运行在Tomcat7上的servlet通信
  • DB是SQL Server 2012
  • 服务器计算机:Windows 64位2008 R2企业服务器
  • Java 7更新25 64位
  • Hibernate版本-3.0
有什么方法可以实现这一点吗

好心的建议


提前感谢

这听起来像是一个典型的例子

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

也许要保持创纪录的版本号

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

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


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

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

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

因为您需要机制和显式锁: