Grails flush: true в закрытии Domain.withTransaction {} - PullRequest
0 голосов
/ 02 мая 2019

Эта статья гласит следующее:

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 Ответ

1 голос
/ 02 мая 2019

Обычно DB-сеанс сбрасывается после завершения всего блока транзакции (либо с 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")
...