gpt4 book ai didi

hibernate - Grails:未刷新的 session 和回滚的交易之间有什么区别?

转载 作者:行者123 更新时间:2023-12-04 02:56:42 26 4
gpt4 key购买 nike

我对 session 和事务感到困惑。我基本上看不到两者兼有什么意义,并且我很困惑何时使用两者之一。

未刷新的 session 和未提交的交易之间有什么区别?

我什至不知道该怎么问...我不知道...是否有资源提供常见 session 和事务处理情况的良好示例,因此我可以看到其中的区别?

最佳答案

通常,Hibernate中的事务与JDBC中的事务几乎相同。当您从Connection获取DataSource时,默认情况下它为autocommit = true,因此对于已更改为autocommit = false的事务。这样,仅在显式提交时(而不是每次执行更新时)才在数据库中进行更改。

Hibernate的Session做一些事情,但是在这种情况下,它的功能是作为1级缓存。它使用称为“事务后写”的概念来提高性能,以使该高速缓存中的更改排队,并仅在必要时将其推送到数据库。因此,例如,如果您检索一个持久实例并在一个复杂的多方法工作流中对其进行更改,其中每个方法可能不做任何更改或进行几处更改,则只需要一个更新SQL语句,因此Hibernate会等到有必要将它们聚合在一起。但是,这与您是否正在事务中运行无关-总是会发生这种情况。

session 高速缓存和事件事务在一起的位置在事件事务期间处于刷新状态。由于Hibernate会等待尽可能长的时间来刷新更改,因此,如果您不在事务中并进行刷新,则更改将立即在数据库中持久化。因此,这是一种性能优化,可减少数据库写入次数。但是,如果您正在事务中并且刷新了 session ,则确实会将更改推送到数据库。但是数据库将更改保留在其事务队列中。因此,即使它们在数据库中,它们也对其他连接不可见,直到您提交事务为止。

理想情况下,不会有任何显式的刷新,并且事务提交将在提交之前触发刷新,这既可以最大程度地减少您需要进入数据库的次数,又可以使未提交的更改对其他调用者不可见。但是您可以根据需要多次冲洗。

查询将导致Hibernate代表您自动刷新的一件事。正如我所说,您可以对持久性实例进行许多更改(甚至删除它们),它们只会在 session 缓存中排队。但是,如果您运行查询(动态查找器,条件,HQL等),则Hibernate无法知道排队的更改是否会影响您的查询。因此,它是悲观的,会刷新以确保查询的所有内容都一致。数据库将使用已刷新但未提交的数据进行查询,并返回预期结果。这就是我们建议您在自定义域类 validator 中进行查询时使用withNewSession方法的原因,这样您就不会在验证期间引起当前 session 刷新,而这会导致奇怪的行为。

关于hibernate - Grails:未刷新的 session 和回滚的交易之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com