spring源码分析-事务的底层源码-1

这里写自定义目录标题

  • spring事务的源码分析
    • 阅读spring事务源码的前置知识
    • JDBC的事务
    • spring当中和事务相关的对象
    • spring应用程序编码
    • spring事务的源码如何开始研究
    • spring源码当中如何代理bean

spring事务的源码分析

最近在研究seata;看了一下spring当中的事务有一点心得故而来写篇文章分享一下;另外对于seata框架的视频讲解在b站上;如果对seata比较感兴趣的可以去三连一下;还有就是关于这篇文章对应的视频讲解我也传到这个b站账号上;
https://space.bilibili.com/419779862

阅读spring事务源码的前置知识

spring事务这块代码写的有点复杂;如果需要完全看懂需要一点点前置知识;

  • JDK动态代理的知识
  • spring bean生命周期和后置处理器的一些知识
  • spring Aop的原理

当然如果你不具备这些知识也没关系知识读起来会难一点;其中关于JDK动态代理的知识我曾经录过一个2小时的手写JDK动态代理的视频;如果你对JDK动态代理不是很了解可以评论区问一下看完一定会非常清晰;当然你如果嫌麻烦就可以直接看下图;记住图中的结论(如果你懂动态代理可以不用看图了);

在这里插入图片描述

JDBC的事务

正常情况下spring的事务是基于jdbc的事务来的;那么我们现在回顾一下jdbc的事务代码;其实非常简单;

onnection connection = getConnection();
connection.setAutoCommit(false);
//执行sql等等操作
//执行完成之后提交
connection.commit();
connection.rollback();

其实你仔细想一下会发现事务他是一个非常难以抽象的概念;比如一个苹果你去抽象可以定义一个类Apple;然后定义一些属性——产地、颜色、价格、口味等等;但是事务这个东西他不是一个名词,严格意义上他是一个动作,甚至不是一个动作是一些列动作(提交、或者回滚);那么作为spring作者他该如何在spring源码当中来抽象呢?——说白了就是该定义一个怎样的类来描述事务这个东西呢?诚如前面说的事务是一个动作spring框架要抽象出来比较困难;所以如果想搞懂spring源码当这块的代码需要先搞明白关于事务的一些对象在spring当中;

spring当中和事务相关的对象

这块相当重要;如果想把spring源码当中对事务的操作代码看懂就一定得先好好看看这一章节;当然这里可能阅读起来很麻烦甚至你看不懂;但是你一定硬着头皮看下去我尽量写详细一点;

1、首先spring如果需要操作事务离不开JDBC那一套——也就是首先的需要获取连接;但是spring当中默认认为你是使用了数据源;也就是DataSource;spring当中定义了一个类TransactionManager——事务管理器里面保存了数据源;这里面的dataSouce需要程序员手动配置给他;相信你如果做过spring开发就写过这行代码
在这里插入图片描述
2、数据源不代表连接;具体的连接对象spring当中有一个类DataSourceTransactionObject这个当中包含了Connetion对象;下面是我对这个类属性的总结,实际spring源码当中封装了很多层;后面再来详细说;这里只是先列举出来方便我们理解spring作者在设计事务这块的思路和类的设计

DataSourceTransactionObject{
   
	previousIsolationLevel;隔离级别
	savepointAllowed;是否允许savepoint
	currentConnection;连接
	transactionActive;事务是否活跃
	mustRestoreAutoCommit;是否需要重置自动提交
	Connection currentConnection;连接信息
}

3、事务状态的包装;spring当中事务是否只读;事务是否完成;事务是否同步;事务是否是一个新的事务等等这些信息用了一个TransactionStatus的类来封装

TransactionStatus{
   //事务的状态
	boolean rollbackOnly = false;//是否只读事务
	boolean completed = false;//是否完成
	Object savepoint;底层数据库支持
	newTransaction; 是否新开的事务
	newSynchronization 是否同步
}	

4、事务的属性,也就是程序在定义事务指定的特点,比如传播机制、比如事务的回滚异常;是否需要指定隔离级别等等在sping当中定义了一个类TransactionAttribute来封装

5、上面四个类怎么关联起来呢?spring当中定义了一个类TransactionInfo他把上面四个类关联起来了;如果上面你没用看懂;你现在就记住一个结论;就是spring在操作事务的时候他最后需要得到一个TransactionInfo的对象;通过这个对象去作判断,比如传播机制是否合理,比如异常是否匹配等等行为去提交事务或者回滚事务;这五个类的关系大体如下面

	TranscationInfo{
    //事务信息 包含了事务的所有操作和信息
		TransactionAttr;//事务属性--程序员配置
		TransactionManager//事务管理器,包含了数据源
		TransactionStatus{
   //事务的状态
			boolean rollbackOnly = false;//是否只读事务
			boolean completed = false;//是否完成
			Object savepoint;底层数据库支持
			private final Object transaction;//
			newTransaction; 是否新开的事务
			newSynchronization 是否同步	
			DataSourceTransactionObject//和数据源关联的事务对象
				DataSourceTransactionObject{
   
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子路程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值