请你谈谈spring事务的底层实现流程的理解?
1、需要通过 @EnableTransactionManagement 注解驱动整个 Spring 事务模块
2、可以通过 @Transactional 注解定义在某个类或者方法上面定义一个事务(传播性、隔离性等),开启事务
3、ProxyTransactionManagementConfiguration 代理配置类用来定义一个 BeanFactoryTransactionAttributeSourceAdvisor 切面,是一个用于 Spring 事务的 AOP 切面
4、Spring 事务底层就是通过 Spring AOP 实现的,可以在上面看到有一个 PointcutAdvisor 切面,关联的 Pointcut 内部有一个 TransactionAttributeSource 对象,会借助于 TransactionAnnotationParser 解析器解析 @Transactional 注解,将这个事务定义的一些属性封装成一个 TransactionDefinition 事务定义对象
5、Spring AOP 拦截处理在 TransactionInterceptor 事务拦截器中,先借助 PlatformTransactionManager 平台事务管理器创建 TransactionStatus 事务对象,里面包含了 Transaction 事务,将 autocommit 自动提交关闭,方法的执行也就处于一个事务中
6、事务的相关属性会保存在许多 ThreadLocal 中,例如 DataSource、Connection 和 SqlSession 等属性,交由一个 TransactionSynchronizationManager 事务同步管理器进行管理,所以说 Spring 事务仅支持在一个线程中完成
1事务拦截的主要接口
TransactionInterceptor:事务拦截功能,继承了Advice接口;主要用作 方法的拦截 事务的创建 业务执行 事务回滚 提交处理等等。
1 首先需要通过 @EnableTransactionManagement 注解驱动整个 Spring 事务模块,开启注解事务。 2 通过import transactionManagementConfigurationSelector.class 注入事务管理相关的配置,组件等。
2.1 ProxyTransactionManagemntConfiguration.class.getName() 这是一个配置类,里面以@bean的方式,配置了BeanFactoryTransactionAttributeSourceAdvisor advisor适配器,并且将transactionAttributeSource(解析属性内容)、transactionInterceptor(方法拦截器)以set的方式设置到 advisor中。 2.2 BeanFactoryTransactionAttributeSourceAdvisor自己的私有属性TransactionAttributeSourcePoint(Pointcut)切入点注入。
3 通过 AutoProxyRegistrar.class.getName() 里面的InfrastructureAdvisorAutoProxyCreator(后置处理Bean) 检查我们的Bean要不要生成代理对象,如果需要就就直接生成代理对象。
3事务的初始化–切面的解析和代理对象的创建过程
接下来是事务的初始化,即切面的解析和代理对象的创建过程: 4 实例化后置处理Bean InfrastructureAdvisorAutoProxyCreator、TransactionIntecptor、TransactionAttribute Source、BeanFactoryAttributeSourceAdvisor。 5 实例化我们的业务Bean,通过执行InfrastructureAdvisorAutoProxyCreator的postProcesAfterInitialization()方法生成代理对象,这个过程包括找出适合的增强器,以及解析事务属性。
4声明式事务的执行流程
接下来是事务的执行流程: 6 流程在invoke()方法中,invokeWithinTransaction()中,通过getTransactionAttributeSource()得到TransactionAttributeSource(解析注解中属性) tas;保存到transactionAttribute txAttr中,根据解析的属性信息构建一个事务管理器。
7 通过createTransactionIfNecessary() 方法创建一个事务并且开启一个事务。
createTransactionIfNecessary(): 1 transactionManagment.getTransaction(解析的事务属性) 获取事务状态:请看一下流程图主要是事务的传播特性的问题流程。 2 创建一个事务信息返回
