在Spring AOP切面中启用新事务
2023-06-13 09:12:47 时间
大家好,又见面了,我是你们的朋友全栈君。
在工作中有一个在切面中需要记录一下操作日志的需求,而且要求这些操作日志要存入数据库,并且无论业务层有什么异常,日志照常记录,那就不能沿用业务层的事务,而是需要新启一个事务了。 sping的声明式事务就是靠AOP来实现的,一般事务都在业务层中启用,那如果要在AOP的逻辑中启用一个新的事务要怎么做呢?比如下面的例子:
//定义一个切点,这里指com.lidehang.remote包下所有的类的方法
@Pointcut("execution(public * com.lidehang.remote..*.*(..))")
public void remote(){}
//切点指定的方法执行完返回后调用
@AfterReturning(returning = "ret", pointcut = "remote()")
public void doAfterReturning(JoinPoint joinPoint,Object ret) throws Throwable {
//一些切面逻辑,包含了数据库操作,为了即便业务层的原事务回滚也不会影响切面中的数据库操作,需要启用新的事务
...
}
经过我的测试,通过在doAfterReturning方法上加上注解@Transactional,并指定传播行为是REQUIRES_NEW依然不行。因为@Transactional也是声明式事务,本身就是AOP实现的,在AOP的代码中使用不起作用。所以就只能使用spring的编程式事务了,需要引入TransactionTemplate。如下:
@Autowired
private TransactionTemplate transactionTemplate;
@AfterReturning(returning = "ret", pointcut = "remote()")
public void doAfterReturning(JoinPoint joinPoint,Object ret) throws Throwable {
//声明式事务在切面中不起作用,需使用编程式事务
//设置传播行为:总是新启一个事务,如果存在原事务,就挂起原事务
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
transactionTemplate.execute(new TransactionCallback<T>() {
@Override
public T doInTransaction(TransactionStatus arg0) {
//一些切面逻辑,包含了数据库操作
...
}
});
}
通过以上的步骤,切面里的逻辑会在新事务中执行,执行完就会提交,和业务层中的原事务无关,即便执行完切面逻辑后继续执行业务代码的过程中出现异常,业务层中的数据库操作因为有原事务而回滚,但切面中的数据库操作不会回滚,因为这是个新的事务!
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157801.html原文链接:https://javaforall.cn
相关文章
- Spring学习笔记(三)——Spring注解开发&spring与Junit整合测试
- Spring Boot+Vue开发实战_有关理解的图片带字
- Spring Boot 运行的时候提示日志错误
- Spring MVC注解Controller源码流程解析--定位HandlerMethod
- 理论:第二章:Spring的AOP和IOC是什么?使用场景有哪些?Spring事务与数据库事务,传播行为,数据库隔离级别
- 用户自定义类加载器下载_spring类加载器顺序
- 为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?
- Spring事务AOP实现原理
- 大白话详解Spring Cloud服务降级与熔断
- 8-Spring事务控制
- spring事务回滚机制_事务回滚失败
- 快速搞懂Spring中实现异步调用的方式有哪些?
- Spring事务失效场景
- Spring-事务
- 了解Spring
- Spring事务回滚的两种方法
- Spring Cloud Security OAuth2 中实现简化模式(二)
- Spring Cloud Security配置JWT和OAuth2的集成实现授权管理(二)
- Spring Cloud Task查看任务状态示例
- Spring依赖注入
- spring mvc 日期转换详解编程语言
- Spring Boot2.0之 整合Redis事务详解编程语言
- Spring Boot2.0之多数据源分布式事务问题详解编程语言
- 运行 Spring Boot 应用的 3 种方式详解编程语言
- Spring Boot中扩展XML请求和响应的支持详解编程语言
- spring boot 给返回值加状态 BaseData详解编程语言
- Spring MVC的国际化
- 读取spring配置文件的方法(spring读取资源文件)