1

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

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

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

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

有什么方法可以实现吗?

好心劝告。

提前致谢

4

3 回答 3

1

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

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

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

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

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

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

于 2013-10-17T13:55:00.380 回答
1

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

于 2013-10-17T13:55:01.380 回答
0

当实体在一个请求中加载并保存在另一个请求中时,数据库事务的ACID 属性不会防止在多请求对话中丢失更新。

对于长时间的对话,您需要隐式乐观锁定机制和显式锁定:

于 2015-05-08T20:44:16.327 回答