【Spring事务详解】--- 4.事务管理器的架构分析

前言

Spring事务详解连载

【Spring事务详解】— 1.事务传播的案例演示
【Spring事务详解】— 2.事务应用的注意事项
【Spring事务详解】— 3.事务失效的八种场景
【Spring事务详解】— 4.事务管理器的架构分析
【Spring事务详解】— 5.事务管理器TransactionSynchronizationManager分析
【Spring事务详解】— 6.事务创建的流程分析
【Spring事务详解】— 7.事务提交、回滚的流程分析
【Spring事务详解】— 8.beforeCommit、beforeCompletion、afterCommit、afterCompletion实现分析

基于Spring良好的架构封装后,如果我们自己操作事务,可以直接使用Spring为我们提供的TransactionTemplate或者PlatformTransactionManagerTransactionTemplate封装了事务处理的核心流程,使用者只需把它注入到自己的上下文中,变可直接使用,而PlatformTransactionManager则是更底层的接口,我们可以直接通过它来控制事务,但它并不是主流的使用方式,一般还是建议优先使用TransactionTemplate或者直接声明式的@Transaction

类的关系图

在这里插入图片描述

TransactionManager

TransactionManager是一个标识接口

public interface TransactionManager {

}

PlatformTransactionManager

PlatformTransactionManager接口继承了TransactionManager,定义了事务的核心方法,提交和回滚,正如前面提到的,可以直接使用它来控制事务,但并不建议这样做,正确的做法应该是继承AbstractPlatformTransactionManager类,典型的样例就是JtaTransactionManagerDataSourceTransactionManager

public interface PlatformTransactionManager extends TransactionManager {

	TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
			throws TransactionException;

	void commit(TransactionStatus status) throws TransactionException;

	void rollback(TransactionStatus status) throws TransactionException;

}

AbstractPlatformTransactionManager

这是一个典型的采用模板方法设计的抽象类,定义了关于事务的核心处理流程。

可以看到几个关键的抽象方法,都交由子类去实现。
在这里插入图片描述

到了下面的具体的子类实现,只需要简单的执行就好了,比如:DataSourceTransactionManager类重写doCommitdoRollback方法只是简单的获取数据库连接后进行事务的提交或者回滚就好了。
在这里插入图片描述

TransactionTemplate

前面通过分析TransactionManager链路下的一些类可以看出,主要就是定义了事务处理的关键方法和核心流程,那么具体执行事务的入口就要看TransactionTemplate了,这是Spring的习惯,XXXTemplate结尾的类,通常目的都是为了简化使用者处理的流程。

TransactionTemplate中定义的入口方法就是execute
在这里插入图片描述

@Override
@Nullable
public <T> T execute(TransactionCallback<T> action) throws TransactionException {
	// 方法执行的第一步就需要先确保transactionManager对象不为空,还记得transactionManager吗?就是前面分析的定义了事务处理的关键方法和核心流程的类。
	Assert.state(this.transactionManager != null, "No PlatformTransactionManager set");
	if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
		return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
	}
	else {
		TransactionStatus status = this.transactionManager.getTransaction(this);
		T result;
		try {
			result = action.doInTransaction(status);
		}
		catch (RuntimeException | Error ex) {
			// Transactional code threw application exception -> rollback
			rollbackOnException(status, ex);
			throw ex;
		}
		catch (Throwable ex) {
			// Transactional code threw unexpected exception -> rollback
			rollbackOnException(status, ex);
			throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception");
		}
		this.transactionManager.commit(status);
		return result;
	}
}
/**

TransactionManagerTransactionTemplate中的一个属性
在这里插入图片描述

整个execute中几个关键的方法实际上都是在调用TransactionManager中提供的方法,doInTransaction则是执行业务代码的地方。
在这里插入图片描述
在这里插入图片描述

TransactionDefinition

TransactionDefinition这个接口主要用来定义事务的传播行为、隔离级别、超时时间、是否只读等属性
在这里插入图片描述

总结

Spring为我们提供的TransactionTemplate类,定义了事务处理的基本流程,对外暴露一个execute方法,并通过传入一个标记性接口TransactionCallback来实现使用者的业务逻辑处理,大大简化了使用方式。

PlatformTransactionManager则更加的灵活,它的目的主要是为了能够让使用者更加方便的在事务流程前后进行业务扩展,比如
它的实现类有:HibernateTransactionManager、JpaTransactionManager、JtaTransactionManager,很明显就是针对不同的ORM框架而定制的。

所以定义TransactionTemplate是为了让事务使用更加方便,定义PlatformTransactionManager是为了让扩展更加的方便。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码拉松

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

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

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

打赏作者

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

抵扣说明:

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

余额充值