在Spring AOP切面中启用新事务

在Spring AOP切面中启用新事务在工作中有一个在切面中需要记录一下操作日志的需求,而且要求这些操作日志要存入数据库,并且无论业务层有什么异常,日志照常记录,那就不能沿用业务层的事务,而是需要新启一个事务了。sping的声明式事务就是靠AOP来实现的,一般事务都在业务层中启用,那如果要在AOP的逻辑中启用一个新的事务要怎么做呢?比如下面的例子://定义一个切点,这里指com.lidehang.remote包下所有的类的方法…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在工作中有一个在切面中需要记录一下操作日志的需求,而且要求这些操作日志要存入数据库,并且无论业务层有什么异常,日志照常记录,那就不能沿用业务层的事务,而是需要新启一个事务了。
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.net/157801.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java基础语法(十一)类?对象?我能不能写个妹子类给自己造个(一个够吗?)对象?

    Java基础语法(十一)类?对象?我能不能写个妹子类给自己造个(一个够吗?)对象?

    2021年5月17日
    160
  • try catch finally 用法

    try catch finally 用法在讲之前我们先看一段程序:publicclassTest{publicstaticvoidmain(String[]args){System.out.println("returnvalueofgetValue():"+getValue());} publicstaticintgetValue(){…

    2022年6月30日
    25
  • centos7系统更新命令_centos 更新

    centos7系统更新命令_centos 更新1.查看网络IP ifconfig2.下载命令 wget+网址3.安装 yum-y install + 目标4.删除文件 sudo rm 文件所在目录/目标强制删除文件 rm -f删除目录 rm -rf5.复制一个文件到另一个文件夹sudo cp /文件夹/文件 /另一个文件夹6.对一些文件进行读写sudo vim 文件名7….

    2022年8月18日
    25
  • 基于卷积神经网络的手写数字识别系统_python 卷积神经网络

    基于卷积神经网络的手写数字识别系统_python 卷积神经网络前面讲解了使用纯numpy实现数值微分和误差反向传播法的手写数字识别,这两种网络都是使用全连接层的结构。全连接层存在什么问题呢?那就是数据的形状被“忽视”了。比如,输入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是,向全连接层输入时,需要将3维数据拉平为1维数据。实际上,前面提到的使用了MNIST数据集的例子中,输入图像就是1通道、高28像素、长28像素的(1,28,28)形状,但却被排成1列,以784个数据的形式输入到最开始的Affine层。图像是3维形状,这个形状中应该含有重要的空间信

    2022年9月14日
    4
  • Yolov5更换backbone,与模型压缩(剪枝,量化,蒸馏)

    Yolov5更换backbone,与模型压缩(剪枝,量化,蒸馏)目前支持更换yolov5的backbone主干网络为Ghostnet,以及采用eagleeye的剪枝方法支持对yolov5系列的剪枝。后续,将会添加更多更轻量,更优秀的主干网络,比如swintrans,…

    2022年8月16日
    9
  • java中文乱码_Java中文乱码问题的解决方案[通俗易懂]

    java中文乱码_Java中文乱码问题的解决方案[通俗易懂]只要掌握了中文乱码问题产生的原因,然后对症下药,就可以顺利地解决这些问题。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。1.以POST方法提交的表单数据中有中文字符由于Web容器默认的编码方式是ISO-8859-1,在Servlet/JSP程序中,通过请求对象的getParameter()方法得到的字符串是以ISO-8859-1转换而来,这是导致乱码产生的原因之一。为了避免容器以ISO…

    2022年7月8日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号