begintransaction事务的作用_spring事务源码分析

本文深入探讨了Spring事务的原理,从初始化事务底层组件、包装代理对象到执行事务方法。通过分析背景、概述及具体步骤,揭示了Spring如何在运行时管理事务,实现事务的自动开启、提交或回滚。主要关注了`begin transaction`在Spring事务管理中的作用,并介绍了相关组件如`AutoProxyRegistrar`和`ProxyTransactionManagementConfiguration`。
摘要由CSDN通过智能技术生成

一.背景

spring事务,其实也没那么复杂!

如果熟悉数据库事务的那几个固定步骤,那再看spring事务不过是裹了一层厚厚的外衣而已。

手写数据库事务的固定步骤:简称事务三板斧

[1] begin transaction

[2] commit transaction

[3] rollback transaction

二、概述

spring要完成事务处理,就需要在spring ioc容器中注入一些组件,这些组件是用来扫描业务应用程序的事务配置(包含注解配置和XML配置,本文讲解以注解配置为主),从配置中找到需要在事务中执行的方法(例如找到带有@Transactional注解的类),进而将带有事务方法的类实例包装为代理对象。等到业务方法执行的时候,进入到代理对象的逻辑,代理对象会在开发人员无感知的情况下,开启事务,执行业务方法,处理嵌套事务,提交/回滚事务。完成了事务三板斧

所以,spring对事务的处理,可以再宏观层面分为三大部分,简称三件套

[1] 初始化事务底层组件:初始化spring处理事务的底层组件

[2] 包装代理对象:spring扫描业务应用程序,找到事务类/方法,包装为事务代理对象

[3] 执行事务方法:业务应用程序执行事务方法,进而执行事务代理对象的方法

下面就详细分析这三件套

三.初始化事务底层组件

1.springboot配置,开启事务

@EnableTransactionManagement

这个注解说是开启事务,到底怎么个开法?看这个注解里面

@Import(TransactionManagementConfigurationSelector.class)

63073d8c50b478defe1468ac68970da5.png
注入组件

可以看到,如果是JDK代理的话,会往spring ioc容器注入两个组件如下

【AutoProxyRegistrar.class】和

【ProxyTransactionManagementConfiguration.class】组件

而AutoProxyRegistrar又是个BeanDefinitionRegistrar,所以它又给容器导入了一些组件

e2042f236988402e7604b6ee0559a502.png
注入组件

这个BeanDefinitionRegistrar也是往容器注入组件的工具,看看它又注入了什么组件

b81f01043d7bc09ab482ac4c2bc445ac.png
注入组件

注入了【InfrastructureAdvisorAutoProxyCreator.class】这个类很重要,继承结构如下,标框的两个类记住它,后面会用到

a42d4a12fb99690c324bf92159c17369.png

而ProxyTransactionManagementConfiguration一看名称就是个配置类,它又以@Bean的方式,给容器注入了三个bean

@Configuration(proxyBeanMethods = false)
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {



	@Bean
	public TransactionAttributeSource transactionAttributeSource() {
		return new AnnotationTransactionAttributeSource();
	}

	@Bean
	public TransactionInterceptor transactionInterceptor(TransactionAttributeSource transactionAttributeSource) {
		TransactionInterceptor interceptor = new TransactionInterceptor();
		return interceptor;
	}

	@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
	public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor(
			TransactionAttributeSource transactionAttributeSource, 
                        TransactionInterceptor transactionInterceptor
        ) {

		BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
		advisor.setTransactionAttributeSource(transactionAttributeSource);
		advisor.setAdvice(transactionInterceptor);
		return advisor;
	}

}

而且,它本身继承了【AbstractTransactionManagementConfiguration】继承结构如下

a82fcd214c14a01e127bdb4f893714f7.png

注意下【ImportAware】,它会被spring在启动过程中调用到

public interface ImportAware extends Aware {

	/**
	 * Set the annotation metadata of the importing @{@code Configuration} class.
	 */
	void setImportMetadata(AnnotationMetadata importMetadata);

}

至此,spring事务需要的底层组件,已经注入到spring ioc容器里了,接下来,在spring启动的过程中,就是这些组件发挥作用的时候了

四.包装代理对象

上述spring底层需要的组件有了以后,这些组件就要干活了,其中一件大事儿就是:

【找到程序中的事务类,包装为代理对象,注入到IOC容器】

1.调用入口:包装代理对象

还记得上述【InfrastructureAdvisorAutoProxyCreator.class】吗?看他的继承结构,

a42d4a12fb99690c324bf92159c17369.png

原来是个BeanPostProcessor,因此,在spring ioc初始化所有bean的过程中,都会调用它的postProcessBeforeInitialization(Object bean, String beanName)

postProcessAfterInitialization(Object bean, String beanName),

这是spring ioc的部分内容。重要的部分截图看下

4182624919c1226d3ef4817b1cdaff73.png

7d139eebe53ea2214d952c2b8ac5f83a.png

b5e4fc34953b95304b2c88067675360f.png

五.执行事务方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值