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")
返回的数据,因为交易与我们保存产品的位置相同,并且即使指令未刷新到数据库,休眠会话也包含已保存产品的信息。
答案 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")