Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Java 同一实体的并发更新_Java_Multithreading_Hibernate_Jpa - Fatal编程技术网

Java 同一实体的并发更新

Java 同一实体的并发更新,java,multithreading,hibernate,jpa,Java,Multithreading,Hibernate,Jpa,各位嘉宾: 我对同一实体的并发更新有问题 进程1获取对象的集合。这个过程没有为了性能而使用Hibernate来检索数据,这听起来有点牵强。此过程还使用Hibernate更新集合中某些对象的某些字段 进程2获得一个类似于集合中的一个对象(基本上是数据库中的同一行)的对象,并以某种方式对其进行更新。这个过程使用Hibernate 由于进程1和进程2彼此不了解,因此它们可以更新相同的实体,使其处于不一致状态 例如: 过程1获得收集 流程2获取一个实体并删除其部分属性以及它链接到的实体 进程1返回并尝试

各位嘉宾:

我对同一实体的并发更新有问题

进程1获取对象的集合。这个过程没有为了性能而使用Hibernate来检索数据,这听起来有点牵强。此过程还使用Hibernate更新集合中某些对象的某些字段

进程2获得一个类似于集合中的一个对象(基本上是数据库中的同一行)的对象,并以某种方式对其进行更新。这个过程使用Hibernate

由于进程1和进程2彼此不了解,因此它们可以更新相同的实体,使其处于不一致状态

例如:

  • 过程1获得收集
  • 流程2获取一个实体并删除其部分属性以及它链接到的实体
  • 进程1返回并尝试保存该实体,并获取实体未找到异常
  • 我需要处理这种情况

    那么我们能做些什么呢

    现在我看到两种方式:

  • 在数据库上方创建一层,该层将跟踪系统中的每个实体,有效地禁止创建同一实体的多个实例
  • 设置乐观锁,因为有些实体不是通过Hibernate获得的,所以我需要以不同的方式实现它
  • 任何想法都会很有帮助

    提前谢谢

    由于进程1和进程2彼此不了解,因此它们可以更新相同的实体,使其处于不一致状态

    我将重新表述:两个进程都可以更新相同的数据。只有Hibernate知道实体,而另一个进程似乎通过JDBC访问数据

    我会选择选项2,它将在您的实体中包含一个版本列。 然后,IIRC Hibernate将在查询中添加一个
    WHERE version=x
    条件,并检查是否所有行都已更新,如果未更新,将抛出一个
    OptimistictLockException
    。您可以在JDBC查询中执行相同的操作,即
    UPDATE。。。设置版本=x+1。。。其中version=x和additionalConditions
    ,并检查JDBC返回的更新行数

    由于进程1和进程2彼此不了解,因此它们可以更新相同的实体,使其处于不一致状态

    我将重新表述:两个进程都可以更新相同的数据。只有Hibernate知道实体,而另一个进程似乎通过JDBC访问数据

    我会选择选项2,它将在您的实体中包含一个版本列。
    然后,IIRC Hibernate将在查询中添加一个
    WHERE version=x
    条件,并检查是否所有行都已更新,如果未更新,将抛出一个
    OptimistictLockException
    。您可以在JDBC查询中执行相同的操作,即
    UPDATE。。。设置版本=x+1。。。其中version=x和additionalConditions
    并检查JDBC返回的更新行数。

    我选择2。我自己也在流程1中应用hibernate/JPA。事实上,如果我不得不猜测的话,为了性能而不使用Hibernate并不是过早优化的论据。请注意应用乐观锁定的后果:并发修改只会导致一个线程成功,而所有其他线程都会失败,只有一个例外。@Gimby我完全同意您对Hibernate的看法。我只是还不能说服我的老板。我宁愿得到有意义的并发更新异常并处理它,而不是意外的实体未找到异常。我自己也在流程1中应用hibernate/JPA。事实上,如果我不得不猜测的话,为了性能而不使用Hibernate并不是过早优化的论据。请注意应用乐观锁定的后果:并发修改只会导致一个线程成功,而所有其他线程都会失败,只有一个例外。@Gimby我完全同意您对Hibernate的看法。我只是还不能说服我的老板。我宁愿得到有意义的并发更新异常并处理它,而不是意外的实体未找到异常。