java - Spring Boot Hibernate 高效的事务管理
问题描述
在与 Hibernate JPA 集成的 Spring Boot 应用程序中。事务管理有哪些不同且最有效的方法,以及针对各种场景需要考虑的关键点。
此时,我们正在@Transactional
对来自控制器层的服务层调用使用注解;服务层因此执行各种读/写 DAO 调用。DAO 方法与@Transactional
.
在必须直截了当的基本场景中,这对我们非常有用,我们在单个服务层调用中对单个实体进行操作,并且我们希望将完整的操作集包含在单个事务中。
但是,如果我们想要根据具体情况采取不同的行为呢?例如,如果我们有一个循环在服务层调用内的一组实体上运行,虽然我们希望每个实体上的操作都是事务性的,但如果我们不希望整个循环成为单个事务。或者,如果在对特定实体进行操作时,需要将多个操作作为工作流的一部分执行,则可能需要这些工作流的子集在出现异常/错误情况时不会影响在它们之前执行的操作在子集中。
我知道有很多不同的方法可以实现这一目标,但我一直在寻找最佳、最有效和最有效方法的线索。
提前致谢!!
解决方案
如果我们有一个循环在服务层调用内的一组实体上运行,尽管我们希望每个实体上的操作都是事务性的,
在事务方法中迭代非事务和处理交互项,或在事务方法中迭代和@Transactional
处理Propagation.REQUIRES_NEW
最后,自己处理事务。https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html
或者,如果在对特定实体进行操作时,需要将多个操作作为工作流的一部分执行,则可能需要这些工作流的子集在出现异常/错误情况时不会影响在它们之前执行的操作在子集中。
典型的长期交易
最好的办法是避免这种情况 - 例如,在多个步骤中创建合同草案 - 并在最后 - 将该合同序列化为适当的实体并将其保存在单个事务中。
推荐阅读
- android - 获取点击项目在 Recycleview 上的位置
- angular - 活动组件的 TabView ActionBar 调用方法
- react-native - 链接两个不同的堆栈导航器
- php - 如何用我从 txt 文件收到的值填充单选按钮?
- module - 如何在 prestashop 模块中使用翻译功能
- javascript - 无法从文件输入中获取发布数据
- javascript - HTML 标记
- reactjs - Changing state but not rerendering react redux
- java - Running a lambda in a loop
- razor - ASP。NET MVC 多语言网站设计