理解Spring aop事务底层原理

  后端与数据库产生交互时,我们只能单一的一次一次去实现数据库的增,删,改,查询的功能,并不能在多个增,删,改,查询操作同时进行时,对其操作进行控制管理。所以我们需要事务管理来解决这种问题。

1.什么是事务?

  service层的同一个业务逻辑下执行的所有操作,要么完全执行,要么都不执行,这种并发控制,就叫做事务。

  • 事务的四大属性:
    A:原子性(Atomicity)
    事务中的操作要么都不做,要么就全做。
    C:一致性(Consistency)
    事务执行的结果必须是从数据库从一个一致性状态转换到另一个一致性状态。
    I:隔离性(Isolation)
    一个事务的执行不能被其他事务干扰
    D:持久性(Durability)
    一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

2.通过案例分析事务

  转账案例中,在一个账户转账到另一个账户时,一旦在转账业务逻辑中出现异常,若在转出之后,转进之前出现异常则会造成转账出现不一致现象(转出账户金额减少,转进账户却没增加)。

2.1分析在spring容器中实现案例,产生上述bug的原因

1)分析业务逻辑代码
在这里插入图片描述
  通过分析我们发现,在每次调用dao层的方法与操作数据库时,我们都会从Spring容器中调用一个datasource数据池注入dao获取一个数据库的连接,这样就会导致每一次的调用方法都不是在同一个线程中,所以无法在同一时间控制不同的方法进行提交或者关闭。

2)解决问题逻辑
  既然是因为每一次调用时获取了不同的连接,所以我们可以创建一个工具类,专门来获取数据库的连接Connection。
在这里插入图片描述
  在ConnectionUtils类添加一个remove方法,为conection和线程实现解绑(线程的remove方法,移除存放在此线程里的connection)

public void removeConnectin(){
	t1.remove();
}

2.2开始创建事务管理类

  获取到了Connection类后,我们就可以通过Connection来管理事务,事务管理分别有:开启事务,提交事务,回滚事务,释放连接。

  • 开启事务
    在这里插入图片描述
  • 提交事务
    在这里插入图片描述
  • 回滚事务
    在这里插入图片描述
  • 释放连接 在这里插入图片描述

2.3更新Service类

1)添加事务管理类
在这里插入图片描述
2)测试管理事务
在这里插入图片描述
  只要代码产生异常,执行操作时,每个操作都是使用的同一个线程中的Connection,所以凡是存在事务当中的操作都无法成功执行,就会使数据库更新一致。
  但是这样添加事务我们会发现,Service层的每个方法都需要添加事务,就会使代码重复性增强,变得臃肿。于是我们引入aop的理念,让Spring来进行事务控制。

3.aop配置事务

  • 在spring容器中配置Cooection类与TransactionManager类
    在这里插入图片描述
  • 配置aop
    在这里插入图片描述

4.配置aop声明式事务步骤

  以上配置我们使用的都是自己创建的事务管理器类,其实spring中有自己的事务管理器类,所以我们可以利用spring中的事务管理器进行配置。

4.1基于xml配置

1)配置事务管理器;
2)配置事务通知,添加事务名称空间与约束;
3)配置aop中的通用切入点表达式;
4)建立事务通知和切入点表达式的对应关系。
在这里插入图片描述
5)添加事务属性(事务隔离级别,事务传播行为等)
在这里插入图片描述

4.2基于注解配置

  • 配置所有需要扫描类的包,在类上添加相应的注解。
    在这里插入图片描述
  • 配置事务管理器(与xml文件一样,注入一个datasource到事务管理器里)
    在这里插入图片描述
  • 添加spring对注解事务的支持
    在这里插入图片描述
  • 在需要事务的service类或方法上添加注解@Transactional(在注解后添加属性)
    在这里插入图片描述
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring AOP (Aspect Oriented Programming) 是 Spring 框架中的一个模块,它实现了面向切面编程,允许开发者将横切关注点(如事务管理、日志记录、安全检查等)抽取到独立的模块中,从而避免代码重复和提高模块的可维护性。Spring AOP底层原理主要基于以下几个关键概念: 1. **通知(Advice)**: 是 AOP 的核心,它是对目标方法执行前后的行为进行增强的代码片段。Spring 提供了五种类型的通知:前置通知(Before)、后置通知(After)、返回后通知(AfterReturning)、异常通知(AfterThrowing)和最终通知(Around)。 2. **切点(Pointcut)**: 定义了一组相关的通知应该何时何地应用。Spring 使用表达式语言(如`@annotation`, `@execution`, `@target`, `@within`等)来定义切点,匹配方法执行的条件。 3. **连接点(Join Point)**: 是程序执行过程中的一点,是通知被应用的地方。Spring AOP 检查通知的匹配条件并在合适的时候执行。 4. **代理(AOP Proxy)**: Spring AOP 实现了一种特殊的代理机制,为被拦截的目标对象创建一个代理对象。有两种代理模式:JDK 动态代理和 CGLIB 生成的字节码代理。对于接口,使用 JDK 动态代理;对于类,如果目标类没有实现接口或没有 final 方法,使用 CGLIB。 5. **切面(Angle)**: 是一组相关通知的集合,由切点和通知组成。在 Spring 中,切面通过 `@Aspect` 注解声明,`@AspectJ` 是其底层语法支持。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值