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