并发READ在DELETE期间导致StaleObjectStateException?

时间:2012-11-15 20:28:30

标签: java spring hibernate

在我们的网站上,我们有两个针对同一个表的操作,一个读取多行,另一个删除一行。

我们正在使用Spring 3.1和Hibernate 3.6。

确切的操作是

EntityManager.createQuery().getResultList();

EntityManager.remove();

我们在remove()线程上获取StaleObjectStateException,而不是在getResultList()线程上。问题是,为什么读取会导致StaleObjectException?

2 个答案:

答案 0 :(得分:0)

像Pace说的那样,可能是你正在修改一些用该查询检索的instace,而instace仍然附加,这意味着在persistenceContext(EntityManager的“实例”)之前,在附加的实例中,提交事务。

另一个可能的事情是您要覆盖版本属性的值,因此entityManager不仅将实例/实体标记为已修改,而且还执行具有较低/未预期版本值的更新查询。

此致

答案 1 :(得分:0)

这个问题的根本原因与Hibernate或Spring完全无关,这是一个HTML / Javascript问题,每次点击相关链接时都会发送两个单独的HTTP请求。 (这两个请求都是编辑,因此这是冲突的根源。)

只需将此答案放在此处,以便人们知道Spring和Hibernate能够正常工作。