当前位置: 首页 > 知识库问答 >
问题:

Spring和Hibernate中的嵌套事务

公冶嘉
2023-03-14

我有一个使用Hibernate/JPA的持久性Spring Boot应用程序。

我正在使用事务来管理我的数据库持久性,并且我正在使用@Transactional注释来定义应该以事务方式执行的方法。

在持久化时,我有三个主要的事务粒度级别:

  1. 要保留的实体批次
  2. 要保留的单个实体
  3. 保留实体的单一数据库操作

因此,在考虑整个持久性流量时,您可以想象我有三个级别的嵌套事务。

第2层和第3层之间的交互如我所愿透明地工作,因为在没有为事务指定任何传播行为的情况下,默认行为是必需的行为,因此整个实体(第2层)被回滚,因为第3层将支持第2层中定义的事务。

然而,问题是,我需要1和2之间的一个稍微不同的交互。如果发生错误,我需要单独回滚一个实体,但我不希望回滚整个批。也就是说,我需要在2级注释@Transactional(propagation=X)中指定符合这些要求的传播行为。

我尝试过<code>REQUIRES_NEW

似乎更适合描述的行为是NESTED,但在使用Spring和HibernateJPA时不被接受,有关详细信息,请参阅此处。

最后一个链接为NESTED类型提供了替代方案,但我想知道NESTED是否真的能解决我的问题,或者是否有另一种行为更适合这项工作。

共有1个答案

傅雪松
2023-03-14

我猜NESTED大概能做你想做的事情,但是我怀疑这是否真的有必要。我不知道您正在尝试做什么,也不知道错误条件是什么,但也许您可以通过使用某种< code>WHERE子句或UPSERT语句来消除错误条件:使用attach dirty(saveourupdate)来Hibernate事务和并发

 类似资料:
  • 问题内容: 在我的应用程序中,有多个步骤,其中将通过多种方法对数据库进行多次提交。例: A呼叫B,再呼叫C。然后B呼叫D。D呼叫E,依此类推。所有这些方法都有一些数据库操作。据我了解(声明式事务管理- 春天推荐的方式),如果 E* 成功完成,则事务(以及 E中的 操作将被提交)。现在,由于某些例外, F 应该导致回滚。我想 从 A 做起的 所有事情都 回滚。是否可以通过声明式事务管理?还是应该使用

  • 问题内容: 我无法理解和传播策略之间的行为差​​异。在我看来,在这两种情况下,当前过程都是回滚的,而不是整个事务。有什么线索吗? 问题答案: 看到此链接:PROPAGATION_NESTED与PROPAGATION_REQUIRES_NEW?Juergen Hoeller对此进行了很好的解释。- 春季高峰论坛是完全脱机SICE 2019 2月28日,但你可以在下面的报价阅读文章的相关部分 PROP

  • 问题内容: 我正在研究应用数据库架构更新的脚本。我已经使用start transaction / commit设置了所有的SQL更新脚本。我在命令行上将这些脚本传递给psql。 现在,我需要在一个事务中同时应用多个脚本。到目前为止,我想出的唯一解决方案是从原始脚本集中删除启动事务/提交,然后将它们卡在新的启动事务/提交块中。我正在编写perl脚本来即时执行此操作。 实际上,我想要嵌套事务,但是我无

  • 如果一个服务方法被标记为具有传播嵌套的,并且在它内部有许多对其他方法的调用,那么这些方法中的每一个都将使用自己的会话?它应该表示多个连接到db,只有一个方法调用no?

  • 我试图用不同的事务管理器嵌套事务,其中如果嵌套的事务失败,外部主事务也需要回滚 我的spring配置文件有 但是,当失败时,中的事务不会回滚。如何使回滚工作?

  • 我有一个模型如下的项目(伪代码): 现在,如果我尝试获取类似的内容(get(0)只是一个示例): 我get LazyInitializationException未能延迟初始化角色的集合:ClientVersion。客户端,没有会话或会话已关闭 若我更改ClientVersion和客户端之间的关系上的FetchType以使其工作正常,但我当然更希望延迟加载它。 我知道如果我有权访问hibernat