Java 由不同的用户使用不同的值同时更新数据库记录

Java 由不同的用户使用不同的值同时更新数据库记录,java,javascript,mysql,hibernate,Java,Javascript,Mysql,Hibernate,我设计了一个基于网络的项目 我正在使用Mysql数据库。我将使用hibernate在java中执行所有持久性逻辑。所有客户端操作都将在javascript中完成 我的问题是 如果两个用户试图在不同的位置同时更新同一记录 最初,User-1通过提供与单个对象相关的完整信息进行更新,并调用saveinformationmethod 在另一个终端,User-2通过提供部分信息来更新相同的记录,并调用save-information方法 如果保存用户1信息,则第一个用户2信息将覆盖第一个给定信息。因此,

我设计了一个基于网络的项目

我正在使用Mysql数据库。我将使用hibernate在java中执行所有持久性逻辑。所有客户端操作都将在javascript中完成

我的问题是

如果两个用户试图在不同的位置同时更新同一记录

最初,User-1通过提供与单个对象相关的完整信息进行更新,并调用saveinformationmethod

在另一个终端,User-2通过提供部分信息来更新相同的记录,并调用save-information方法

如果保存用户1信息,则第一个用户2信息将覆盖第一个给定信息。因此,某些信息可能会丢失用户1提供的信息,但他不知道某些信息丢失了


请给出一些解决此问题的建议。

在用户2更新数据库之前,您可以检查数据库中的信息(例如行)是否与用户2到达更新/编辑页面时的信息相同。e、 g.您可以在用户到达页面时对行进行选择,并在用户进行更改后(即在更新行之前)再次进行选择,并在更新数据库之前进行比较


如果行相同,则没有更改。如果该行不同,其他人已经编辑它。

您需要考虑的是对数据的策略。使用Hibernate时,默认情况下没有锁定(也称为鸵鸟锁定或“最后保存赢”)。大致上,其他两个选项是乐观锁定和悲观锁定

乐观锁定意味着您不阻止用户同时编辑数据,但如果用户的编辑失败,您将通知用户,因为数据是从数据库加载后从其他位置保存的

悲观锁定意味着阻止多个用户同时编辑数据。这是一种更复杂的锁定形式,通常既不实用也不需要


有关实施锁定策略的更多信息,请访问。您应该选择哪种策略在很大程度上取决于您的应用程序以及是否需要许多用户频繁编辑相同的信息。

我建议您使用乐观锁。基本上,这种技术是在表中有一个字段来告诉Hibernate您的版本,从而告诉Hibernate版本较小的对象是否试图覆盖版本较大的数据Hibernate是否会引发异常。此版本控制字段通常是数字字段,hibernate会随着每次更新或日期字段的增加而增加。流程类似于:

1-将记录插入到基础中。此时,“版本”字段设置为零

2-X用户查询版本为0的记录

3-Y用户查询版本为0的记录

4-Y用户更新注册表信息。此时,hibernate会自动为1增加记录的版本

5-X用户更新版本0上的信息并尝试保存。此时,hibernate发现记录的版本1已经高于用户X使用的版本,因为它抛出一个异常,说明问题,不允许覆盖最新的信息

要实现此策略,只需在表中创建一个数字字段,然后应用@Version:

    @Version
    @Column(name = "version")
    private Integer version;