一、AOP 相关术语
名词 | 解释 |
---|---|
Joinpoint(连接点) | 它指的是那些可以用于把增强代码加入到业务主线中的点,这些点指的就是方法,在方法执行的前后通过动态代理技术加入增强的代码,在Spring框架AOP思想的技术实现中,也只支持方法类型的连接点 |
Pointcut(切入点) | 它指的是那些已经把增强代码加入到业务主线进来之后的连接点 |
Advice(通 知 / 增强) | 它指的是切面类中用于提供增强功能的方法,并且不同的方法增强的时机是不⼀样的,比如: 开启事务肯定要在业务方法执行之前执行 提交事务要在业务方发正常执行之后执行 回滚事务要在业务方法执行产生异常之后执行 那么这些就是通知的类型,其分类有:前置通知 后置通知 异常通知 最终通知 环绕通知 |
Target(目标对象) | 它指的是代理的目标对象,即被代理对象 |
Proxy(代理) | 它指的是⼀个类被AOP织入增强后,产生的代理类,即代理对象 |
Weaving(织入) | 它指的是把增强应用到目标对象来创建新的代理对象的过程,Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入 |
Aspect(切面) | 它指定是增强的代码所关注的方面,把这些相关的增强代码定义到⼀个类中,这个类就是切面类。例如,事务切面,它里面定义的方法就是和事务相关的,像开启事务,提交事务,回滚事务等等,不会定义其他与事务无关的方法 |
- 连接点:方法开始时、结束时、正常运行完毕时、方法异常时等这些特殊的时机点,我们称之为连接点,项目中每个方法都有连接点,连接点是⼀种候选点
- 切入点:指定AOP思想想要影响的具体方法是哪些,描述感兴趣的方法
- Advice增强
- 第⼀个层次:指的是横切逻辑
- 第二个层次:方位点(在某⼀些连接点上加入横切逻辑,那么这些连接点就叫做方位点,描述的是具体的特殊时机)
- Aspect切面:切面概念是对上述概念的⼀个综合
Aspect切面 = 切入点 + 增强
Aspect切面 = 切⼊点(锁定方法) + 方位点(锁定方法中的特殊时机)+ 横切逻辑
二、Spring 声明式事务的支持
- 编程式事务:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务
- 声明式事务:通过 xml 或者注解配置的方式达到事务控制的目的,叫做声明式事务
2.1 事务的四大特性
- 原子性
- 概念:原子性是指事务是⼀个不可分割的工作单位,事务中的操作要么都发生,要么都
不发生,从操作的角度来描述,事务中的各个操作要么都成功要么都失败
- 概念:原子性是指事务是⼀个不可分割的工作单位,事务中的操作要么都发生,要么都
- ⼀致性
- 概念:事务必须使数据库从⼀个⼀致性状态变换到另外⼀个⼀致性状态
- 场景:转账前A有1000,B有1000,转账后A+B也得是2000,不可能出现类似A=900,B=1000这种情况
- 隔离性
- 概念:事务的隔离性是多个用户并发访问数据库时,数据库为每⼀个用户开启的事务,每个事务不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
- 场景:事务1给员工涨工资2000,但是事务1尚未被提交,员工发起事务2查询工资,发现工资涨了2000块钱,读到了事务1尚未提交的数据(脏读)
- 持久性
- 概念:持久性是指⼀个事务⼀旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障,也不应该对其有任何影响
2.2 事务的隔离级别
不考虑隔离级别,会出现以下情况:(以下情况全是错误的),也即为隔离级别在解决事务并发问题
- 脏读
- 概念:⼀个线程中的事务读到了另外⼀个线程中未提交的数据
- 不可重复读
- 概念:⼀个线程中的事务读到了另外⼀个线程中已经提交的update的数据(前后内容不⼀样)
- 场景:
员工A发起事务1,查询工资,工资为1万,此时事务1尚未关闭
财务人员发起了事务2,给员工A张了2000块钱,并且提交了事务
员工A通过事务1再次发起查询请求,发现工资为1.2万,原来读出来1万读不到了
这就叫做不可重复读
- 虚读(幻读)
- 概念:⼀个线程中的事务读到了另外⼀个线程中已经提交的insert或者delete的数据(前后条数不⼀样)
- 场景:
事务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 类似的操作 |
网友评论