Spring常用事务传播特性
2023-06-13 09:14:08 时间
前提
以下案例使用成功的前提是Spring事务传播机制正常工作的情况下。 个人理解Spring传播机制一定要自己写Demo测试复现以方便理解记忆,避免在企业项目开发中踩坑。 博客错误及不足之处欢迎评论指正,谢谢!
Propagation.REQUIRED
默认事务,如果不存在事务,创建一个事务,然后执行事务操作,最常见的选择。
该事务的行为:
- 如果它作为一个子事务方法,在其他事务方法中被调用,那么该方法不会创建新的事务,加入当前事务,使用现有的父级别的事务。
- 如果它作为一个子事务方法,没有在其他事务方法中被调用,而是在非事务方法中直接调用,那么它会创建一个新的事务来执行数据库操作。
应用场景:
不知道方法的调用者是否创建了事务,但是要求当前被调用的方法必须在一个事务中执行。
注意:当需要日志记录的业务场景中,外部事务记录日志信息留痕,并在外部代码中捕获异常处理,主流业务使用单独方法,传播行为REQUIRES_NEW,可以保证在不关注主流业务的情况下日志被留痕。
Propagation.REQUIRES_NEW
新建事务,不依赖于环境的”内部“事务,这个事务将被完全提交或回滚而不依赖于外部事务,它拥有自己的隔离范围,自己的锁,当内部事务开始执行时,外部事务将被挂起,内部事务结束时,外部事务将继续执行。
应用场景:
常用于日志记录或交易失败仍要留痕及时序控制,即事务步骤要求时序的情况。
public boolean createUser(User user) {
userMapper.insertUser(user);
Menu menu = new Menu();
menu.setId(99);
menu.setPattern("11");
menuService.insertMenuRequireNew(menu);
return true;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insertMenuRequireNew(Menu menu) {
menuMapper.addMenu(menu);
if (true) {
throw new RuntimeException();
}
}
- 内部事务异常,外部事务未捕获Service异常时,内部Service异常时,不影响外部事务,仅回滚内部事务。
- 内部事务异常,外部事务捕获Service异常时,内部Service异常时,影响内部事务,两事务均回滚。
- 外部事务异常,在调用内部事务前,外部事务Service抛出异常,外部事务回滚
Propagation.NESTED
Spring查询当前是否存在事务,如果已存在事务,创建一个保存点,即若代码逻辑抛出异常,代码回滚到保存点,如果没有活跃的事务,则作用和默认REQUIRED类型事务一致。
NESTED类型创建的事务,实则为字事务。
异常类型 | Service 1 | Service 2 |
---|---|---|
user正常/menu正常 | 正常提交 | 正常提交 |
user异常/menu正常 | 回滚 | 未执行 |
user正常/menu异常 | 外部user调用menu时使用try/catch捕获,user正常提交。当外部user调用menu不使用try/catch捕获时,user、menu均回滚 | 回滚 |
user异常/menu异常 | 回滚 | 回滚 |
Service 1
@Transactional(propagation = Propagation.REQUIRED)
public void createUserNestedOpen() {
try {
User user = new User(221, "NESTED");
userMapper.insertUser(user);
Menu menu = new Menu();
menu.setId(99);
menu.setPattern("11");
menuService.insertMenu(menu);
} catch (Exception e) {
log.error(e.getMessage());
}
}
Service 2
@Transactional(propagation = Propagation.NESTED)
public void insertMenu(Menu menu) {
menuMapper.addMenu(menu);
if (true) {
throw new RuntimeException();
}
}
使用try/catch捕获内部事务的情况
可见事务id是同一个。
外部事务异常
相关文章
- 聊聊Spring Cloud Alibaba的架构思想
- Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
- Spring学习笔记(十四)——ssm整合mybitis的逆向工程和分页插件
- Spring batch教程 之 spring batch简介
- 聊聊Spring事务控制策略以及@Transactional失效问题避坑
- Spring StoredProcedure for Oracle cursor
- 谈谈Spring bean的生命周期,作用域
- java定时器scheduled_spring定时任务注解
- 发现一个Spring事务的巨坑bug,可是官方都不承认?大家来评评理!
- 面试遇到Spring双层事务不回滚怎么破
- java 配置事务回滚_Spring@Transactional事务回滚
- spring事务回滚的多种方式「建议收藏」
- springboot配置多个yml_spring几种配置方式
- spring是什么意思_什么spring是孩子
- mybatis-spring源码解析--事务详解
- Spring Boot + Elasticsearch 实现索引的日常维护
- Java框架Spring入门-第一个spring项目
- 面试官问:Spring中有几种依赖注入的方式?你能答出来吗
- Spring使用自带的DataSourceTransactionManager声明式事务(xml)模板
- aop事务管理-Spring事务实现原理
- 记录一次Spring事务线上异常
- 【Spring Boot实战与进阶】集成RockerMQ消息队列
- Spring Cloud Gateway配置路由规则(二)
- Spring Cloud Security的核心组件-OAuth2
- Spring Bean继承
- Spring事务的传播特性和隔离级别详解编程语言
- Spring事务传播特性的浅析和事务方法嵌套调用详解编程语言
- Spring Boot入门第四天:使用Thymeleaf模板引擎详解编程语言
- Spring Boot入门第二天:一个基于Spring Boot的Web应用,使用了Spring Data JPA和Freemarker。详解编程语言
- Spring Cloud之Swagger2API接口管理详解编程语言
- Spring boot 自定义拦截器详解编程语言
- Spring事务异常回滚,捕获异常不抛出就不会回滚详解编程语言
- 在 IDEA 中创建 Spring Boot 项目的方式(详细步骤教程)