Grails刷新:在Domain.withTransaction {}闭包内部为true

时间:2019-05-02 09:53:36

标签: hibernate grails gorm

This文章说:

Product.withTransaction{
    product.status = "ACTIVE"
    product.save(flush:true) //without this line the total number will be all of them but this one
    Product.countByStatus("ACTIVE")
}

不清楚的部分是以下评论:

  

如果没有这一行,总数将是除此以外的全部

以及上面代码之后的文章中的解释:

  

在之前的代码中,不强制使用flush:true,我们将省略在交易中保存的产品。

据我了解,如果我们调用product.save()(不刷新),则product实例应附加到Hibernate会话,成为persistent实体,该实体应包含在数字中Product.countByStatus("ACTIVE")返回的数据,因为交易与我们保存产品的位置相同,并且即使指令未刷新到数据库,休眠会话也包含已保存产品的信息。

1 个答案:

答案 0 :(得分:1)

通常,在整个事务块(使用withTransaction{}withSession{}或声明性划分)完成之后,将刷新数据库会话。

flush:true使会话立即被刷新。这意味着,如果调用product.save(),则count*()方法会在会话刷新到数据库之前返回数据。如果在交易后致电count*(),则会得到相同的行为:

Product.withTransaction{
    product.status = "ACTIVE"
    product.save()
}
// here the TX shouldv'e been committed already
Product.countByStatus("ACTIVE")