首页 > 解决方案 > Spring Boot Hibernate 高效的事务管理

问题描述

在与 Hibernate JPA 集成的 Spring Boot 应用程序中。事务管理有哪些不同且最有效的方法,以及针对各种场景需要考虑的关键点。

此时,我们正在@Transactional对来自控制器层的服务层调用使用注解;服务层因此执行各种读/写 DAO 调用。DAO 方法与@Transactional.

在必须直截了当的基本场景中,这对我们非常有用,我们在单个服务层调用中对单个实体进行操作,并且我们希望将完整的操作集包含在单个事务中。

但是,如果我们想要根据具体情况采取不同的行为呢?例如,如果我们有一个循环在服务层调用内的一组实体上运行,虽然我们希望每个实体上的操作都是事务性的,但如果我们不希望整个循环成为单个事务。或者,如果在对特定实体进行操作时,需要将多个操作作为工作流的一部分执行,则可能需要这些工作流的子集在出现异常/错误情况时不会影响在它们之前执行的操作在子集中。

我知道有很多不同的方法可以实现这一目标,但我一直在寻找最佳、最有效和最有效方法的线索。

提前致谢!!

标签: javaspringhibernatespring-bootspring-transactions

解决方案


如果我们有一个循环在服务层调用内的一组实体上运行,尽管我们希望每个实体上的操作都是事务性的,

在事务方法中迭代非事务和处理交互项,或在事务方法中迭代和@Transactional处理Propagation.REQUIRES_NEW

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#isolation--

最后,自己处理事务。https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html

或者,如果在对特定实体进行操作时,需要将多个操作作为工作流的一部分执行,则可能需要这些工作流的子集在出现异常/错误情况时不会影响在它们之前执行的操作在子集中。

典型的长期交易

最好的办法是避免这种情况 - 例如,在多个步骤中创建合同草案 - 并在最后 - 将该合同序列化为适当的实体并将其保存在单个事务中。


推荐阅读