当前位置: 首页 > 面试题库 >

Grails:未刷新的会话和回滚的交易之间有什么区别?

卢晟
2023-03-14
问题内容

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

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

我什至不知道该问些我不知道的事…是否有资源提供常见会话和事务处理情况的良好示例,因此我可以看出区别吗?


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 您能否解释以下两种交易类型之间的区别: Hibernate交易 Spring交易 我也想了解注释。 问题答案: 对于初学者来说,它们都是事务,但是它们包含不同的概念和组件。 TL; DR Hibernate处理数据库特定的事务,而spring提供常规的事务管理服务。是配置事务管理行为的好方法。 长话说: 交易次数 事务基本上是工作的单元(即,对某事物的更改),可以作为可提交或回滚的单个

  • 问题内容: 您能否解释以下两种类型的交易之间的区别: 休眠交易 春季交易 我也想知道有关注释的信息。 问题答案: 对于初学者来说,它们都是事务,但是它们包含不同的概念和组件。 TL; DR Hibernate处理数据库特定的事务,而spring提供常规的事务管理服务。是配置事务管理行为的好方法。 长话说: 交易次数 事务基本上是工作的单元(即,对某项的更改),可以作为可提交或回滚的单个操作进行管理

  • 本文向大家介绍脱链交易和链上交易有什么区别?相关面试题,主要包含被问及脱链交易和链上交易有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 回答:** 链上交易:这些交易在区块链上可用,并且对区块链网络上的所有节点都是可见的。它包括由一定数量的参与者对交易进行身份验证和确认。 链下交易:这些交易处理区块链外部的值,可以使用多种方法进行。

  • 问题内容: 我刚刚开始我的JPA 2.0学习,并且我有这段代码: 我的问题是:我不确定我是否完全了解会话的使用和事​​务的使用之间的区别。请在几行中告诉我他们之间最大的不同吗?谢谢 ! 问题答案: 您去银行存了2张支票,并提取了一小笔。 因此,您排队等候直到出纳员打开。 您进行首次存款。 那你第二。 然后您退出。 现在您完成了,您离开了柜员行。 进入柜员就像创建您的会话,现在您已经在银行,可以开始

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型