spring AOP和事务相关知识

Spring AOP

  • Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。


    什么是AOP1

    AOP(Aspect Orient Programming)也就是面向切面编程,作为面向对象编程(OOP)的一种补充,面向切面编程将程序运行过程分解成各个切面。
    AOP可以拦截指定的方法并且对方法增强,且无需侵入到业务代码中,使业务与非业务处理逻辑分离。比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

AOP的基本概念

切面(Aspect)2: 切面用于组织多个Advice,Advice放在切面中定义。

  • 连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。

  • 增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around"、"before"和"after"等类型

  • 切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。

AOP的作用

Spring AOP是Spring框架的一个重要特性,它主要用于解决系统中横切关注点的问题。横切关注点3是指影响应用多处的功能(安全、事务、日志)。Spring AOP的作用主要包括以下几个方面:

  1. 分离关注点:通过AOP,可以将不同业务逻辑之间相互关联的代码分离出来,使得系统更加模块化、易于维护和扩展。

  2. 降低重复性代码:AOP可以将一些重复性的代码,如日志记录、异常处理等,抽取到切面中,避免在每个业务方法中重复编写这部分代码。

  3. 集中式管理:AOP提供了一种集中式管理横切关注点的方式,使得这些关注点的变更和维护更加方便。

  4. 提高可维护性:通过AOP,可以将系统中横切关注点的修改集中到一个地方,而不需要修改各个模块的代码,提高了系统的可维护性。

  5. 实现横切关注点:AOP可以帮助在不同的类、对象或模块间实现横切关注点,比如事务管理、安全检查、性能监控等功能。

总的来说,Spring AOP的作用在于提高系统的模块化程度、降低重复性代码、提高可维护性,并且通过切面的方式实现横切关注点,使得系统更加灵活和易于扩展。

AOP的优缺点

  • 优点在不改变原代码的情况下,加入新的逻辑代码

  • 缺点逻辑不连贯,阅读体验不好(代码变得更加复 杂,健壮性无法保证)

Spring AOP三种使用方式4

  1. 使用Spring自带的AOP

  2. 使用Aspectj实现切面(普通POJO的实现方式)

  3. 使用Aspectj实现切面(基于注解的实现方式)


事务管理

在关系数据库管理系统中,事务通常通过事务管理器来实现。


事务的定义

事务:是指作为单个逻辑工作单元执行的一系列操作。在数据库领域,事务通常涉及对数据库的读取和/或更新操作。

事务的特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部提交成功,要么全部失败回滚。即事务是不可分割的最小工作单元,要么全部执行,要么全部不执行。

  2. 一致性(Consistency):事务在完成时,必须是所有的数据都保持一致状态。

  3. 隔离性(Isolation):多个事务同时执行时(事务并发5),每个事务的操作应当与其他事务的操作相互隔离,互不干扰。这样可以避免多个事务并发执行时出现数据不一致的情况。

  4. 持久性(Durability):一旦事务提交,其结果应该是永久性的,对系统故障具有抵御能力。即使系统崩溃,已经提交的事务对数据库的修改也不应该丢失。

事务并发可能导致的问题

  1. 脏读:一个事务读到另一个事务未提交的更新数据。
  2. 不可重复读:一个事务两次读同一行数据,可是这两次读到的数据不一样。
  3. 幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。
  4. 丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。

事务隔离级别

隔离级别由低到高【读未提交】=>【读已提交】=>【可重复读】=>【序列化操作

名称说明脏读不可重复读幻读解释
ISOLATION_DEFAULT-1spring默认数据库的隔离级别---这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED1读未提交这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。
ISOLATION_READ_COMMITTED2读已提交×保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
ISOLATION_REPEATABLE_READ4可重复读××这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。
ISOLATION_SERIALIZABLE8序列化操作×××这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。

TRANSACTION_NONE JDBC 驱动不支持事务
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
TRANSACTION_READ_COMMITTED 禁止脏读,但允许不可重复读和幻读。
TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读,单运行幻读。
TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。

隔离级别越高,意味着数据库事务并发执行性能越差,能处理的操作就越少。

事务的传播属性

名称说明
PROPAGATION_REQUIRED0当前如果有事务,Spring就会使用该事务;否则会开始一个新事务(增、删、改)
PROPAGATION_SUPPORTS1当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务(查询)
PROPAGATION_MANDATORY2当前如果有事务,Spring就会使用该事务;否则会抛出异常
PROPAGATION_REQUIRES_NEW3当前如果有事务,把当前事务挂起,新建事务
PROPAGATION_NOT_SUPPORTED4当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则该事务挂起
PROPAGATION_NEVER5当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
PROPAGATION_NESTED6当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与REQUIRED一样

事务的管理方式



  1. Spring AOP全面详解(超级详细) ↩︎

  2. 什么是切面(内含许多链接和有趣的评论) ↩︎

  3. AOP的相关术语 ↩︎

  4. 详情参见 ↩︎

  5. 在企业级应用中,多用户访问数据库是常见的场景,这就是所谓的事务的并发。 ↩︎

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值