Hibernate 休眠刷新只读事务
我有一个使用spring和hibernate的web应用程序。我的应用程序有多个线程同时从同一个表中获取数据。表示表的实体类已进行版本控制(具有@Version注释字段) 问题是我在检索数据时经常遇到OptimisticLock异常(StaleDataObject异常)。我理解,在以下情况下会发生这种情况:Hibernate 休眠刷新只读事务,hibernate,jpa,transactions,Hibernate,Jpa,Transactions,我有一个使用spring和hibernate的web应用程序。我的应用程序有多个线程同时从同一个表中获取数据。表示表的实体类已进行版本控制(具有@Version注释字段) 问题是我在检索数据时经常遇到OptimisticLock异常(StaleDataObject异常)。我理解,在以下情况下会发生这种情况: 线程1检索数据 线程2从同一个表中检索数据 线程1刷新数据 线程2尝试刷新数据,但数据已过时 我试图将事务性getter方法标记为只读,因为它们唯一要做的就是获取数据。我还设置了传播,以确保
@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
不幸的是,表中的版本仍然在每次检索时更新,我仍然得到相同的异常
我错过什么了吗?这些方法应该只从数据库中检索数据,它们仍然会导致这些异常
非常奇怪的是,只有我使用的应用程序遇到了这样的问题,我认为hibernate会以更好的方式处理它(?) 锁呢?您使用悲观锁还是乐观锁?可能是
锁模类型。乐观锁强制增量/写入
?看起来是这样,但如果我们不强制增量写入,它将如何检测陈旧数据?锁模类型。乐观锁模类型(或其同义词锁模类型.读取
)作为陈旧数据的检测器已经足够好了LockModeType.OPTIMISTIC\u FORCE\u INCREMENT
(或其同义词LockModeType.WRITE
)可能会在每次读取给定行时额外增加版本字段,如果其他人读取了记录,而另一人正在修改它,则会导致OptimisticLockException
。我认为您不需要LockModeType.WRITE
,因为如果给定的实体已被读取,但未被修改,则增加其version
字段没有意义。当有人实际执行“WRITE”操作时,LockModeType.Optimistic会增加版本吗?