2010-02-26 49 views
2

如果在第一个查询和第二个查询之间的不同会话内的并发更新中更改了该查询的结果数据,那么当您在一个tx内执行相同的查询两次时,是否可以使用Hibernate获取StaleObjectStateExceptionHibernate - StaleObjectStateException在查询中可能吗?

我在此场景中的所有实体上使用乐观并发控制。

所以它看起来像这样。

线程1:事务开始
线程1:查询被执行,并检索与键= 4711
线程2即顺序:用键4711相同的顺序被取出,改变和致力于在第二线程
螺纹-1:查询再次执行,并应返回键= 4711的订单

我会在第二个查询中的Thread-1中得到StaleObjectStateException吗?

感谢您的帮助!

Thomas

回答

1

声明:我还没有尝试过,这是我所知道的冬眠期望值。

你会不是得到一个StaleObjectStateException当执行第二个查询时,或者当从线程-1的事务提交。

但是,如果如果order被执行第二查询之前修改,order将得到刷新(假设自动冲洗模式和读写事务)被执行的第二个查询权之前,这将引发StaleObjectStateException

+0

感谢您的回答。与此同时,我写了一个测试,其中显示了你所描述的内容。 如果线程1在执行第二个查询之前以某种方式更改顺序,由于autoflush,我将得到StaleObjectException。 这实际发生在最近的一个项目中,起初似乎很奇怪,因为订单的变化是由于副作用。 – herrwieger 2010-03-19 16:39:42

0

我不这么认为。 Thread-1中的第二个查询甚至没有命中数据库,您将从第一级缓存(Session)中获得(陈旧的)对象。但是,如果您在第二次查询后更改顺序,则会在清除会话时发生异常。