第29集 解析事务属性中的传播属性
【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
1、事务属性有哪些?
- 1、事务属性
- 2、传播属性
- 3、只读属性
- 设置事务为只读,提高事务运行的效率 false
- 4、超时属性
- 超时属性 通过超时属性 设置本事务 最长一个等待时间 -1 由数据库底层决定 等待时间
- 5、异常属性
- RuntimeException 及其子类 默认回滚
- Exception 及其子类 默认提交
2、请详细介绍下传播属性
为了解决传播属性 PROPAGATION 事务嵌套问题出现了传播属性
1. REQUIRED 当前的这个业务方法 外部没有事务 开启事务 外部存在事务 则融合
2. REQUIRED_NEW 当前的这个业务方法 外部没有事务 开启事务 外部存在事务 挂起外部事务,开启新的事务,执行完新的事务,在还原外部事务继续执行
3. MANDATORY 当前的这个业务方法 外部必须存在事务
4. NEVER 当前的这个业务方法 外部一定不能存在事务
5. SUPPORTS 当前的这个业务方法 外部没有事务 则不开启事务,外部存在事务 则融合
6. NOT_SPPORTED 当前的这个业务方法 外部没有事务 则不开启事务,外部存在事务 抛异常
7. NESTED 内嵌事务 SavePoint
3、Spring对于事务属性底层 如何来实现 事务属性 所产生的效果呢?
ISOLATION READONLY TIMEOUT Spring 底层没有实现
4、ISOLATION READONLY TIMEOUT Spring的底层没有实现 谁实现了这3个事务属性呢?
- JDBC 规范决定 ----> 驱动完成
- conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
- conn.setReadOnly(true);
- conn.setNetworkTimeout();
5、Spring实现的有那些属性?
异常属性
1. try(RE E instanceof RuntimeException Exception )
conn.commit conn.rollback
传播属性
2. Spring实现 追源码的方式
6、Spring声明式事务AOP
第一个要注意的
- 1、一定应用了代理【JDK或者Cglib】
- 2、Spring在整理代理的过程中,它实际上是基于BeanPostProcessor,就是前面讲的AOP源码意识到的
第二个要注意的
- 所谓的spring单机版事务 一定是依附于连接池 进而通过 连接的这些操作来控制事务,最后spring会把连接绑定在ThreadLocal当中
第三个要注意的
- 1、JDBC和Mybatis都是依附于 DataSourceTransactionManager实现的是(PlatformTransactionManager接口)
- 2、需要TransactionAttributes
7、基于注解讲解,剖析思路
1、BeanPostProcessor 创建代理
2、调用Service.xxx方法过程中 动态在运行时 原始功能+事务额外功能 整合在一起
8、EnableTransactionManagement解析
TransactionManagementConfigurationSelector解析
- 1、截图EnableTransactionManagement
- 2、查看属性含义【注意Order和Mode】
- 3、@Import(TransactionManagementConfigurationSelector.class)
- 4、查看TransactionManagementConfigurationSelector
- 4.1、case Proxy,不用看ASPECTJ
- 4.2、AutoProxyRegistrar是干什么的?AutoProxyRegistar 是一个ImportBeanDefinitionRegistrar
- 4.3、ProxyTransactionManagementConfiguration是干什么的?ProxyTransactionManagementConfiguration是解析事务属性
- 1、Advisor或者是Interceptor
- 2、有advice ->TranactionManager
- 3、transactionAttrbiutes 事务属性
- 5、总结
-
AutoProxyRegistrar解析
调用AOPConfigUtils来处理注册处理事务的切面的BeanDefinition
ProxyTransactionManagementConfiguration解析
userService.register(user)的整个运行过程
第29集学习目标
1、EnableTransactionManagement解析过程
- @Import(TransactionManagementConfigurationSelector.class)
- ProxyTransactionManagementConfiguration作用:创建切面,注册切面
- AutoProxyRegistrar:作用注册BeanPostProcessor【InfrastructureAdvisorAutoProxyCreator】,获取切面,获取原始对象,创建代理。
2、@Transactional这个注解是怎么生效的呢是怎么创建代理的呢?
在执行BeanPostPrcessor执行到了InfrastructureAdvisorAutoProxyCreator这个BeanPostProcessor的beanPostProcessorAfter创建代理的时候,它会去检查当前方法或者当前类有没有@Transactional注解,有这个注解的话就会创建代理。在代理执行方法的时候会检查这个方法有没有这个注解,如果有这个注解才会进行代理事务的处理。