SpringAOP与事务

SpringAOP

1. 什么是AOP

AOP为Aspect Oriented Programming的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP实际上是OOP(面向对象编程)的补充,利用AOP的思想可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2.如何理解AOP

假如这里有两个流程,这两个流程都需要进行安全校验、性能统计等辅助逻辑,传统OOP很难将这些逻辑进行封装,OOP是至上而下的编程方式,犹如一个树状图,A调用B,B调用C,或者A继承B,B继承C,这种方法对于业务逻辑是合适的,可以通过调用或继承的方式进行复用,但对于辅助逻辑就显得不太灵活。

AOP就是为了解决这一问题存在的。AOP可以做到在不修改原有代码同时,能让辅助逻辑在所有业务逻辑中生效,就像一把铡刀横穿所有方法。OOP是纵向的,而AOP做到了横向,两者结合可以构建出良好的程序结构。

img

有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。

以下是关于AOP的一些名词的解释。

  • Target(目标对象):织入 advice 的目标对象. 目标对象也被称为 advised object.
  • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
  • Joinpoint(连接点):在应用执行过程中能够插入切面的一个点。(注:就是抽象的「切点」声明所指代的那些具体的点。
  • Pointcut(切入点)::一组连接点的总称,用于指定某个增强应该在何时被调用
  • Advice(通知/增强): Advice 是一个动作, 即一段 Java 代码, 这段 Java 代码是作用于Point Cut 所限定的那些Join Point 上的
  • Aspect(切面):Aspect 由 Pointcut 和 Advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中.
  • Weaving (织入):是指把增强应用到目标对象来创建新的代理对象的过程。spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

3. 我们为什么要使用AOP?

我们可以利用AOP的思想来对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

事务

1.什么是事务

事务(Transaction)是访问并可能更新数据库中各项数据项的一个程序执行单元(unit)。 事务具有四个特征:原子性、一致性、隔离性和持久性。这四个特征通常称为ACID

2.事务的四个特征

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。

一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。 也就是说事务前后数据的完整性必须保持一致。

隔离性(Isolation)
隔离性是指一个事务的执行不能有其他事务的干扰,事务的内部操作和使用数据对其他的并发事务是隔离的,互不干扰。

持久性(Durability)
持久性是指一个事务一旦提交,对数据库中数据的改变就是永久性的。此时即使数据库发生故障,修改的数据也不会丢失。接下来其他的操作不会对已经提交了的事务产生影响。

3.脏读、不可重复读、幻读

3.1 脏读

例:A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它,这个数据变得不再纯粹。这个时候A事务立即读取了这个脏数据,但事务B良心发现,又用回滚把数据恢复成原来干净、纯粹的样子,而事务A却什么都不知道,最终结果就是事务A读取了此次的脏数据,称为脏读。

这种情况常发生于转账与取款操作中

3.2 不可重复读

意思是前后多次读取,数据内容不一致

例:事务A在执行读取操作,由整个事务A比较大,前后读取同一条数据需要经历很长的时间 。而在事务A第一次读取数据,比如此时读取了小明的年龄为20岁,事务B执行更改操作,将小明的年龄更改为30岁,此时事务A第二次读取到小明的年龄时,发现其年龄是30岁,和之前的数据不一样了,也就是数据不重复了,系统不可以读取到重复的数据,成为不可重复读。

3.3 幻读

前后多次读取,数据总量不一致

例:事务A在执行读取操作,需要两次统计数据的总量,前一次查询数据总量后,此时事务B执行了新增数据的操作并提交后,这个时候事务A读取的数据总量和之前统计的不一样,就像产生了幻觉一样,平白无故的多了几条数据,成为幻读。

4.事务的隔离级别

未提交读(Read uncommitted):最低的隔离级别,允许“脏读”(dirty reads),事务可以看到其他事务“尚未提交”的修改。如果另一个事务回滚,那么当前事务读到的数据就是脏数据。

提交读(read committed):一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。

可重复读(repeatable read):一个事务可能会遇到幻读(Phantom Read)的问题。

串行化(Serializable):最严格的隔离级别,所有事务按照次序依次执行,不会出现脏读、不可重复读、幻读的情况。虽然 Serializable 隔离级别下的事务具有最高的安全性,但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低。如果没有特别重要的情景,一般都不会使用 Serializable 隔离级别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值