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

文章目录

  • 前言
  • 类的关系图
  • TransactionManager
  • PlatformTransactionManager
  • AbstractPlatformTransactionManager
  • TransactionTemplate
  • TransactionDefinition
  • 总结

前言

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

类的关系图

【Spring事务详解】--- 4.事务管理器的架构分析_第1张图片

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

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

可以看到几个关键的抽象方法,都交由子类去实现。
【Spring事务详解】--- 4.事务管理器的架构分析_第2张图片

到了下面的具体的子类实现,只需要简单的执行就好了,比如:DataSourceTransactionManager类重写doCommitdoRollback方法只是简单的获取数据库连接后进行事务的提交或者回滚就好了。
【Spring事务详解】--- 4.事务管理器的架构分析_第3张图片

TransactionTemplate

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

TransactionTemplate中定义的入口方法就是execute
【Spring事务详解】--- 4.事务管理器的架构分析_第4张图片

@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中的一个属性
【Spring事务详解】--- 4.事务管理器的架构分析_第5张图片

整个execute中几个关键的方法实际上都是在调用TransactionManager中提供的方法,doInTransaction则是执行业务代码的地方。
【Spring事务详解】--- 4.事务管理器的架构分析_第6张图片
【Spring事务详解】--- 4.事务管理器的架构分析_第7张图片

TransactionDefinition

TransactionDefinition这个接口主要用来定义事务的传播行为、隔离级别、超时时间、是否只读等属性
【Spring事务详解】--- 4.事务管理器的架构分析_第8张图片

总结

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

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

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

你可能感兴趣的:(Spring事务,spring,架构,java)