SpringBoot启动过程深度解析——Spring声明式事务@Transactional启动过程与事务执行过程解析
Spring声明式事务简单的概述:
在方法的外部添加注解或者直接在配置文件中定义,将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。
spring的AOP恰好可以完成此功能:事务管理代码的固定模式作为一种横切关注点,通过AOP方法模块化,进而实现声明式事务。
如何开启声明式事务
注解方式:
在配置类/启动类加上注解@EnableTransactionManagement
xml方式:
1.添加标签 <aop:config>
2.添加标签 <tx:advice>
使用声明式事务的注解 @Transactional
isolation:设置事务的隔离级别(7种)
propagation:事务的传播行为
noRollbackFor:哪些异常不回滚
注意:运行时异常默认回滚,编译时异常默认不回滚
noRollbackForClassName:哪些异常类不回滚
rollbackFor:哪些异常事务需要回滚
rollbackForClassName:填写的参数是全类名
readOnly:设置事务是否为只读事务
如果你一次执行多条查询语句,例如统计查询,报表查询,多条查询SQL必须保证整体的读一致性,此时应该启用事务支持。
否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态。
对于只读查询,可以指定事务类型为readonly,即只读事务。由于只读事务不存在数据的修改,因此数据库将会为只读事务提供一些优化手段
timeout:事务超出指定执行时长后自动终止并回滚,单位是秒
Spring给出了7种事务隔离级别
【怎么样都不要事务的】
NEVER(强制):以非事务方式运行,如果当前存在事务,则抛出异常。
NOT_SUPPORTED:以非事务方式运行,如果当前存在事务就挂起,然后以非实物执行。
【可有可无的】
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式运行。
【一定会有事务的】
REQUIRES_NEW:无论有没有都新建事务;如果原来有,就将原来的挂起,使用新建的事务。
NESTED :如果没有,就新建一个事务;如果有,就在当前事务中嵌套内部事务。
REQUIRED (默认) :如果没有,就新建一个事务;如果有,就加入当前事务。
MANDATORY (强制有事务) :如果没有,就抛出异常;如果有,就使用当前事务。
使用嵌套事务时,需要注意的组合场景
Spring声明式事务创建过程,以及执行过程
以下就以注解的方式讲解