Spring 源码分析之事务2 TransactionStatus与TransactionInfo

 我来答
科创17
2022-06-12 · TA获得超过5878个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:171万
展开全部

Spring 源码分析之事务
Spring 源码分析之事务2 TransactionStatus与TransactionInfo
Spring 源码分析之事务3 事务的提交与回滚

首先说一下两个类的作用:
TransactionStatus 以及子类:主要描述当前事务的状态,比如:是否有事务,是否是新事物,事务是否只读;回滚点相关操作等等。这些相关的属性在后面会影响事务的提交。
TransactionInfo 主要是持有事务的状态,以及上一个TransactionInfo 的一个引用,并与当前线程进行绑定。主要是为了保证当前请求持有的是自己的事务对象,根据自己的事务状态决定事务的提交与否。

该类结构图如下:

通过分析我们发现TransactionStatus接口的实现类抽象类AbstractTransactionStatus类主要完成以下功能:

如果想要使用事务的回滚相关操作,继承了 AbstractTransactionStatus 类的子类必须提供实现,否则在使用事务的回滚点相关操作的时候会抛出异常。

该类还完成了事务相关功能:

我们可以全局的看看DefaultTransactionStatus结构图:

AbstractTransactionStatus 中包含了3条属性:

所以 DefaultTransactionStatus 对象最终包含的信息有:

AbstractTransactionStatus 的完成的主要功能:

1.回滚点相关操作(是否有回滚点、设置回滚点、获取回滚点,创建回滚点)
2.标记事务已经完成

首先 protected TransactionInfo createTransactionIfNecessary 这个方法会返回一个TransactionInfo ,即在创建事务的时候,会返回。
如下:

查看prepareTransactionInfo()方法

此方法完成如下功能:

完整的类如下:
TransactionInfo 是抽象类TransactionAspectSupport的一个内部类

如果存在一个业务中法中调用多个其他业务,比如:ServiceA的a方法,调用了ServiceB的b方法和ServiceC的c方法。在调用ServiceB的和调用ServiceC的时候当前的事务对象是什么样子的,是和bindToThread()方法有关的,也就是和属性oldTransactionInfo 和持有transactionInfo的当前线程有关。
这里也可以继续关注一下 restoreThreadLocalStatus 方法。
没调用一个业务的时候,每个业务方法都有自己的TransactionInfo,每次执行的时候,都会把当前线程中的TransactionInfo取出来,然后新建自己的TransactionInfo,并在自己的TransactionInfo中,将刚刚取出来的TransactionInfo作为oldTransactionInfo 记录到自己的TransactionInfo中。然后每次执行完一个自己的业务逻辑执行,都会再次执行restoreThreadLocalStatus()方法,也就是将本地线程中的TransactionInfo设置为当前TransactionInfo中的oldTransactionInfo。保证每次执行自己的业务的时候,使用的是自己的TransactionInfo即可,保证事务对象不会发生错乱。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式