首页 > 其他分享 >AOP事务处理

AOP事务处理

时间:2023-06-29 16:22:31浏览次数:29  
标签:事务 事务处理 切面 提交 AOP 方法 conn

前言

AOP是Spring的一大特性,面向切面编程给开发者提供了一种全新的开发思路,不侵入业务逻辑,不修改业务逻辑的代码,实现一些程序必要的辅助功能,比如说:输出日志、权限校验、事务处理等等,优雅的AOP让程序的方法不再紧紧地耦合在一起,达到了解耦的目的,想用就用,不想用就不用

AOP介绍

AOP也就是面向切面编程,Aspect Oriented Programming,AOP的思想就是把非必要的功能抽取成一个切面类,在切面类中实现种种增强方法,再通过动态代理把原来实现的业务类代理起来,在原来业务方法的指定的时机调用我们指定的增强方法。
说人话就是,一个方法功能不够完善,我想在方法开始前干A事,在方法返回后干B事,在方法抛出异常的时候干C事,如果我把所有的方法都写进原来的业务的方法中,那么业务方法会很臃肿而且难维护,如果这些A、B、C事每个业务类都要干,那么我就要在每个业务类中都加入A、B、C事,这样繁琐的工作无疑是让人抓狂的。
所以我们就把A、B、C方法都抽取出来写在一个切面类里,并且指定,这些A、B、C方法在哪些类的哪些方法的哪些时机去调用,这样就解耦了业务方法和增强方法,我们只需要维护切面类里的方法,修改他们的调用时机,就可以达到动动小手,操控所有的目标。

AOP术语

切点:指需要增强的方法
横切关注点:指方法的四个调用时机,开始前、返回后、异常后、后置
通知:额外添加的方法
切面:切点+通知
四个横切关注点:

前置,方法开始时
后置,方法最终执行,无论是否异常,相当于finally块
异常,方法抛出异常时,相当于catch
返回,方法正常执行完成,相当于return之前

事务是如何实现的

在JAVA中,我们通过DataSource去getConnection,拿出来的连接都是autoCommit,也就是说每次通过Connection去操作数据库,自动帮我们开启了一个事务,并且每次都自动提交。
我们知道事务的原子性要求事务里的操作要么一次全部执行,要么一次全部不执行,如果按照初始连接的自动提交去执行一次Service类中的方法,有可能发生前面的操作成功,后面的操作失败,导致事务的原子性被破坏的情况。
为了防止破坏原子性的事情发生,我们需要保证事务只在我们需要的时候提交,也要在发生异常的时候去回滚,而不是每次都去提交,所以我们需要保证以下几点:

事务不能自动提交
所有的操作使用的连接都是同一个
在抛出异常的时候需要回滚
正常操作的时候要及时提交
代码解释
void transaction(){
	// 前置通知
	Connection conn = getConnection();
	conn.setAutoCommit(false);
	try{
		Object val = method.invoke();
		// 返回通知
		conn.commit();
		return val;
	}catch(Exception e){
	// 异常通知
		conn.rollback();
	}finally{
	// 最终通知
		conn.setAutoCommit(true);
		conn.close();
	}
	
	
}

如何用AOP实现事务

AOP实现事务的思路其实很简单:

在方法开始调用的时候,获取连接,把连接的自动提交设置为false
在方法正常执行完毕的时候,AOP得帮我们提交事务
在方法出现异常的时候,AOP得帮我们回滚事务
不管是否出现异常,最后都需要把连接放回连接池,并把自动提交还原回true

具体实现思路

有了思路之后就很清晰了,根据对应的需求,转换成技术的实现:

在所有Service方法开始的时候,也就是做一个前置通知
在方法执行完毕的时候,做一个AfterReturning通知帮我们提交
在方法结束时,帮我们关闭连接,做一个After通知
在方法抛出异常时,做一个AfterThrowing通知,帮我们回滚

标签:事务,事务处理,切面,提交,AOP,方法,conn
From: https://www.cnblogs.com/liangkuan/p/17514501.html

相关文章

  • 利用JAVA的AOP运行时注解实现请求VO的复杂组装
    背景上一篇介绍了关于JAVA的AOP编译时注解的开发经验,因此,这里则接着来讲讲AOP运行时注解,摘取的是利用运行时注解实现微服务对请求对象(VO)中的指定字段特殊处理的统一封装,典型场景就是SpringCloudGateway对用户请求经过鉴权、过滤、路由等处理之后,将必要信息添加到消息头中,转发到相......
  • sql server 事务处理模板
    sqlserver事务处理模板setxact_abortonbegintrybegintran--这里写你自己的sqlcommittranendtrybegincatchif(xact_state())=-1beginrollbacktranendif(......
  • Spring面向切面编程(AOP)
    在软件开发中,我们经常需要解决一些与业务逻辑无关的横切关注点(cross-cuttingconcerns),例如日志记录、性能监测、事务管理等。传统的面向对象编程方法往往将这些关注点与核心业务逻辑混杂在一起,导致代码的可维护性和可扩展性下降。为了解决这个问题,Spring框架引入了面向切面编程(AOP......
  • 15. AOP总结
    1.AOP的核心概念概念:AOP(AspectOrientedProgramming)面向切面编程,一种编程范式作用:在不惊动原始设计的基础上为方法进行功能增强核心概念代理(Proxy):SpringAOP的核心本质是采用代理模式实现的连接点(JoinPoint):在SpringAOP中,理解为任意方法的执行切入点(Pointcut):匹配连......
  • 14. AOP配置管理
    1.AOP切入点表达式前面的案例中,有涉及到如下内容:​​对于AOP中切入点表达式,我们总共会学习三个内容,分别是语法格式​、通配符​和书写技巧​。1.1语法格式首先我们先要明确两个概念:切入点:要进行增强的方法切入点表达式:要进行增强的方法的描述方式对于切入点的......
  • spring aop里的三种不同类型的自动代理介绍
    springaop里的三种不同类型的自动代理介绍MetadataautoproxyingBeanNameAutoProxyCreatorDefaultAdvisorAutoProxyCreator Metadataautoproxying介绍在SpringAOP中,Metadataautoproxying(元数据自动代理)是一种基于元数据配置的自动代理创建方式,它是我们最常用的一种自......
  • 什么是Spring AOP里的引入(Introduction)?
    在SpringAOP中,引入(Introduction)是一种特殊类型的通知,允许我们向现有的类添加新的接口和实现,而无需修改原始类的代码。引入提供了一种扩展现有类功能的方式,它允许我们在运行时为类动态地添加新的方法和属性。通过引入,我们可以将新的行为添加到现有的类中,而无需继承该类或修改其代......
  • 8. Java-AOP 面向切面编程
    专题使用汇总:Java-IDEAJava-Maven,依赖管理,私服https://www.cnblogs.com/chenshaojun2008/p/17493632.htmlJava-IOC&DIJava-Mybatis连接池,动态sqlhttps://www.cnblogs.com/chenshaojun2008/p/17496913.htmlJava-文件上传(本地和OSS)Java-登录校验JWT,过滤器,拦截器使用总结......
  • springboot 通过aop切面的方式打印controller 出入参数
    pom文件引入<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>定义切面类AspectConfigimportcom.alibaba.fastjson.JSONObject;importlombok.extern.slf4j.......
  • spring aop
    切面表达式execution表达式基本语法格式为:execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)除了返回类型模式,方法名模式和参数模式外,其它项都是可选的。例如://com下所有方法@Pointcut("execution(*com..*.*(..))") @Pointcut("execution(public*cn.......