【问题标题】:How to prevent lost updates in Java application which uses hibernate?如何防止使用休眠的 Java 应用程序丢失更新?
【发布时间】:2013-10-26 01:08:27
【问题描述】:

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

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

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

  • 应用程序使用 Java web-start 技术与运行在 Tomcat7 上的 Servlet 进行通信。
  • DB 是 SQL Server 2012。
  • 服务器机器:Windows 64 位 2008 R2 Enterprise Server。
  • Java 7 更新 25 64 位
  • 休眠版本 - 3.0

有什么方法可以实现吗?

请多多指教。

提前致谢

【问题讨论】:

    标签: java hibernate jakarta-ee jpa transactions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      也许维护记录版本号。

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2015-06-27
          • 2011-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 2016-06-29
          • 1970-01-01
          相关资源
          最近更新 更多