Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Hibernate 休眠刷新只读事务_Hibernate_Jpa_Transactions - Fatal编程技术网

Hibernate 休眠刷新只读事务

Hibernate 休眠刷新只读事务,hibernate,jpa,transactions,Hibernate,Jpa,Transactions,我有一个使用spring和hibernate的web应用程序。我的应用程序有多个线程同时从同一个表中获取数据。表示表的实体类已进行版本控制(具有@Version注释字段) 问题是我在检索数据时经常遇到OptimisticLock异常(StaleDataObject异常)。我理解,在以下情况下会发生这种情况: 线程1检索数据 线程2从同一个表中检索数据 线程1刷新数据 线程2尝试刷新数据,但数据已过时 我试图将事务性getter方法标记为只读,因为它们唯一要做的就是获取数据。我还设置了传播,以确保

我有一个使用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会增加版本吗?