在事务中间刷新会话

时间:2015-11-29 05:15:37

标签: java spring hibernate spring-transactions

Stack : spring and hibernate.

service method looks like below,

@Transaction (readonly=false)

public void doSomething(){

    step1: fetch object1,

    step2: modify list from object1 (i.e object1.getListObject2()),

    step3: fetch object3,

    step4: do some more processing,

}

我注意到会话在第3步中刷新了。 无法理解为什么必须在事务中刷新会话。

1 个答案:

答案 0 :(得分:1)

考虑到步骤2中所做的更改,最需要刷新,以便在步骤3执行的查询检索正确的值。

让我们举一个简单的例子:

List<Bike> bikes = findAllBikes();
bikes.forEach(bike -> bike.setColor("red"));
List<Bike> blueBikes = findAllBlueBikes();
// blueBikes should be an empty list, right?

如果Hibernate在执行findAllBlueBikes()之前没有刷新,它会对仍包含蓝色自行车的数据库行执行查询,因为之前在线上所做的更改(即使所有自行车都变红)将不会#39已经被冲了过来。因此,查询将返回非空的自行车列表,尽管它们应该全部为红色。

更糟糕的是:由于Hibernate会在其第一级缓存中找到自行车,因此蓝色自行车的查询会返回实际上是红色的自行车。