先生们/女士,
我对同一实体的并发更新有问题。
进程1获取对象集合。这个过程并没有使用Hibernate来检索数据,这对于我来说听起来有点牵强。此过程还使用Hibernate更新集合中某些对象的某些字段。
进程2获取一个类似于集合中某个对象的对象(基本上是DB中的同一行)并以某种方式更新它。这个过程使用Hibernate。
由于流程1和流程2不了解彼此,因此可以更新同一实体,使其处于不一致状态。
例如:
我需要处理这种情况。
那么可以做些什么呢?
现在我看到两种方式:
任何想法都会非常有用
提前致谢
答案 0 :(得分:4)
由于流程1和流程2彼此不了解,因此可以更新同一实体,使其处于不一致状态。
我重新表述:两个进程都可以更新相同的数据。只有Hibernate知道实体,而另一个进程似乎通过JDBC访问数据。
我会去选项2,这将涉及您实体中的版本列。
然后,IIRC Hibernate会向查询添加WHERE version = x
条件,并检查是否所有行都已更新,如果不是,则会抛出OptimistictLockException
。您可以在JDBC查询中执行相同操作,即UPDATE ... SET ... version = x + 1 ... WHERE version = x AND additionalConditions
,并检查JDBC返回的更新行数。