Spring 事务总结

Spring事务

  • 1. 引言
    • MySQL事务
  • 2. Spring 事务
    • Spring 事务配置方式
    • Spring 事务传播机制
    • Spring 事务隔离机制
  • @Transactional

1. 引言

MySQL事务

是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事务具有ACID特性:原子性、隔离性、一致性、持久性
事务的隔离级别:读未提交,读已提交,可重复读,串行化
分别能解决的问题:修改丢失、脏读、不可重复读、幻读

2. Spring 事务

Spring本身并不支持事务,Spring的事务是依赖于底层数据库的事务。Spring通过结合了IOT和AOP,提供了一套事务管理机制,简化了应用程序使用事务。
所以说,Spring事务主流方式是:底层采用MySQL事务,代码层面依赖于Spring AOP实现的。

Spring 事务配置方式

1. 编程式事务管理
编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager。
2. 声明式事务管理
声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。
编程式事务每次实现都要单独实现,但业务量大功能复杂时,使用编程式事务无疑是痛苦的,而声明式事务不同,声明式事务属于无侵入式,不会影响业务逻辑的实现,只需要在配置文件中做相关的事务规则声明或者通过注解的方式,便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是Spring倡导的非侵入式的编程方式。唯一不足的地方就是声明式事务管理的粒度是方法级别,而编程式事务管理是可以到代码块的,但是可以通过提取方法的方式完成声明式事务管理的配置。

Spring 事务传播机制

事务的传播是指,一个事务方法里调用另外一个事务的方法。那么两个方法是各自作为独立的方法提交,还是内层的事务合并到外层的事务一起提交,这就是需要事务传播机制的配置来确定怎么样执行。
常见的事务传播机制如下:

  • PROPAGATION_REQUIRED
    Spring默认的传播机制,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行
  • PROPAGATION_REQUES_NEW
    该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可
  • PROPAGATION_SUPPORT 如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务
  • PROPAGATION_NOT_SUPPORT
    该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码
  • PROPAGATION_NEVER 该传播机制不支持外层事务,即如果外层有事务就抛出异常
  • PROPAGATION_MANDATORY 与NEVER相反,如果外层没有事务,则抛出异常
  • PROPAGATION_NESTED
    该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。

Spring 事务隔离机制

和数据库相同,多个事务同时运行可能导致并发问题:脏读、不可重复读和幻读。理想状态下是各个事务完全隔离,但这样会严重影响性能,所以Spring提供了一下隔离级别来应对不同场景:
Spring 事务总结_第1张图片

@Transactional

使用方式:
第一步:配置xml信息
第二步:将@Transactional 注解添加到合适的方法上,并设置合适的属性信息。除此以外,@Transactional 注解也可以添加到类级别上。当把@Transactional 注解放在类级别时,表示所有该类的公共方法都配置相同的事务属性信息。
在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@Transactional 的属性配置信息,这个代理对象决定该声明@Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截,在 TransactionInterceptor 拦截时,会在在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器(图 2 有相关介绍)AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务, 如图 1 所示。

你可能感兴趣的:(Spring)