spring 事务部分共5篇文章
第一篇:spring中@EnableTransactionManager @Transactional注解实现机制
第二篇:spring boot中事务功能自动配置的加载过程分析
第三篇:spring@Transactional注解属性字段含义
第四篇:spring @Transactional如何测试事务注解生效
第五篇:spring及spring boot中事务相关知识的总结
本篇为第五篇
基础知识1:java事务
Java事务的类型有三种:JDBC事务、JTA(Java Transaction API)事务、容器事务。
1、JDBC事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。 java.sql.Connection 提供了以下控制事务的方法:
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
三种Java事务差异
JDBC事务控制的局限性在一个数据库连接内,但是其使用简单。
JTA事务的功能强大,事务可以跨越多个数据库或多个DAO,使用也比较复杂。
容器事务,主要指的是J2EE应用服务器提供的事务管理,局限于EJB应用使用。
基础知识2:两个注解
spring boot对事务的支持主要是两个注解:
@EnableTransactionManagement
会自动扫注解 @Transactional 的方法和类(表示该类中所有public的方法都需要开启事务的)
在spring boot中这个注解会在系统启动时自动加载,具体过程见下面的加载过程解析
@Transactional
使用注解来选择需要使用事务的方法(切入点),声明该方法需要事务支持,这是一个基于 AOP 的实现操作
@Transactional来修饰一个方法时,将mysql的底层事务进行了抽象,总结起来就做了3件事:
1. 将autocommit=off,为回滚做准备
2. 根据配置的isoliation,set tx_isolation,默认是RC级别,所以即便你的mysql的tx_isolation是RR级别,但通过spring transaction会重新制定tx_isolation,优先级要高于mysql设置的tx_isolation
3. 在方法执行过程中如果报错,执行rollback,否则执行commit
总结spring及spring boot中事务的使用
-
第1条线:注册需要的bean。
@EnableTransactionManagement加载处理类AutoProxyRegistrar以及ProxyTransactionManagementConfigration,注册事务增强器Advisor,以及事务拦截器interceptor。
-
第2条线:为标注@Transactional的bean返回增强后的代理对象
利用InfrastructureAdvisorAutoProxyCreator后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器)。在对对象进行字节码提升的过程中,通过SpringTransactionAnnotationParser识别@Transactional注解,为join point连接点在指定的切点pointcut位置,将TransactionAdvisor织入weave TransactionInterceptor(与spring aop中BeforeAdvice,AfterAdvice都转换为MethodInterceptor,是相同的做法)
-
在 TransactionInterceptor执行invoke方法,
将mysql的底层事务进行了抽象,总结起来就做了3件事:
-
将autocommit=off,为回滚做准备
-
根据配置的isoliation,set tx_isolation,默认是RC级别,所以即便你的mysql的tx_isolation是RR级别,但通过spring transaction会重新制定tx_isolation,优先级要高于mysql设置的tx_isolation
-
在方法执行过程中如果报错,执行rollback,否则执行commit
-