Spring -- AOP 基础应用

一、AOP 相关术语

名词 解释
Joinpoint(连接点) 它指的是那些可以用于把增强代码加入到业务主线中的点,这些点指的就是方法,在方法执行的前后通过动态代理技术加入增强的代码,在Spring框架AOP思想的技术实现中,也只支持方法类型的连接点
Pointcut(切入点) 它指的是那些已经把增强代码加入到业务主线进来之后的连接点
Advice(通 知 / 增强) 它指的是切面类中用于提供增强功能的方法,并且不同的方法增强的时机是不⼀样的,比如:
开启事务肯定要在业务方法执行之前执行
提交事务要在业务方发正常执行之后执行
回滚事务要在业务方法执行产生异常之后执行
那么这些就是通知的类型,其分类有:前置通知 后置通知 异常通知 最终通知 环绕通知
Target(目标对象) 它指的是代理的目标对象,即被代理对象
Proxy(代理) 它指的是⼀个类被AOP织入增强后,产生的代理类,即代理对象
Weaving(织入) 它指的是把增强应用到目标对象来创建新的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
Aspect(切面) 它指定是增强的代码所关注的方面,把这些相关的增强代码定义到⼀个类中,这个类就是切面类。例如,事务切面,它里面定义的方法就是和事务相关的,像开启事务,提交事务,回滚事务等等,不会定义其他与事务无关的方法
  • 连接点:方法开始时、结束时、正常运行完毕时、方法异常时等这些特殊的时机点,我们称之为连接点,项目中每个方法都有连接点,连接点是⼀种候选点
  • 切入点:指定AOP思想想要影响的具体方法是哪些,描述感兴趣的方法
  • Advice增强
    1. 第⼀个层次:指的是横切逻辑
    2. 第二个层次:方位点(在某⼀些连接点上加入横切逻辑,那么这些连接点就叫做方位点,描述的是具体的特殊时机)
  • Aspect切面:切面概念是对上述概念的⼀个综合
    Aspect切面 = 切入点 + 增强
    Aspect切面 = 切⼊点(锁定方法) + 方位点(锁定方法中的特殊时机)+ 横切逻辑

二、Spring 声明式事务的支持

  • 编程式事务:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务
  • 声明式事务:通过 xml 或者注解配置的方式达到事务控制的目的,叫做声明式事务

2.1 事务的四大特性

  • 原子性
    1. 概念:原子性是指事务是⼀个不可分割的工作单位,事务中的操作要么都发生,要么都
      不发生,从操作的角度来描述,事务中的各个操作要么都成功要么都失败
  • ⼀致性
    1. 概念:事务必须使数据库从⼀个⼀致性状态变换到另外⼀个⼀致性状态
    2. 场景:转账前A有1000,B有1000,转账后A+B也得是2000,不可能出现类似A=900,B=1000这种情况
  • 隔离性
    1. 概念:事务的隔离性是多个用户并发访问数据库时,数据库为每⼀个用户开启的事务,每个事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
    2. 场景:事务1给员工涨工资2000,但是事务1尚未被提交,员工发起事务2查询工资,发现工资涨了2000块钱,读到了事务1尚未提交的数据(脏读)
  • 持久性
    1. 概念:持久性是指⼀个事务⼀旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障,也不应该对其有任何影响

2.2 事务的隔离级别

不考虑隔离级别,会出现以下情况:(以下情况全是错误的),也即为隔离级别在解决事务并发问题

  • 脏读
    1. 概念:⼀个线程中的事务读到了另外⼀个线程中未提交的数据
  • 不可重复读
    1. 概念:⼀个线程中的事务读到了另外⼀个线程中已经提交的update的数据(前后内容不⼀样)
    2. 场景:
      员工A发起事务1,查询工资,工资为1万,此时事务1尚未关闭
      财务人员发起了事务2,给员工A张了2000块钱,并且提交了事务
      员工A通过事务1再次发起查询请求,发现工资为1.2万,原来读出来1万读不到了
      这就叫做不可重复读
  • 虚读(幻读)
    1. 概念:⼀个线程中的事务读到了另外⼀个线程中已经提交的insert或者delete的数据(前后条数不⼀样)
    2. 场景:
      事务1查询所有工资为1万的员工的总数,查询出来了10个人,此时事务尚未关闭
      事务2财务人员发起,新来员工,工资1万,向表中插入了2条数据,并且提交了事务
      事务1再次查询工资为1万的员工个数,发现有12个人,见了鬼了

数据库共定义了四种隔离级别

  • Serializable(串行化--级别最高)
    可避免脏读、不可重复读、虚读情况的发生
  • Repeatable read(可重复读--级别第二)
    可避免脏读、不可重复读情况的发生(幻读有可能发生) ,该机制下会对要update的行进行加锁
  • Read committed(读已提交--级别第三)
    可避免脏读情况发生,不可重复读和幻读⼀定会发生
  • Read uncommitted(读未提交--级别最低)
    以上情况均无法保证

注意:级别依次升高,效率依次降低

  • MySQL的默认隔离级别是:REPEATABLE READ(可重复读--级别第二)
  • 查询当前使用的隔离级别:select @@tx_isolation;
  • 设置MySQL事务的隔离级别: set session transaction isolation level xxx; (设置的是当前mysql连接会话的,并不是永久改变的)

2.3 事务的传播行为

传播行为 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建⼀个事务,如果已经存在⼀个事务中,加入到这个事务中,这是最常见的选择
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作

你可能感兴趣的:(Spring -- AOP 基础应用)