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
或者PlatformTransactionManager
,TransactionTemplate
封装了事务处理的核心流程,使用者只需把它注入到自己的上下文中,变可直接使用,而PlatformTransactionManager
则是更底层的接口,我们可以直接通过它来控制事务,但它并不是主流的使用方式,一般还是建议优先使用TransactionTemplate
或者直接声明式的@Transaction
TransactionManager
是一个标识接口
public interface TransactionManager {
}
PlatformTransactionManager
接口继承了TransactionManager
,定义了事务的核心方法,提交和回滚,正如前面提到的,可以直接使用它来控制事务,但并不建议这样做,正确的做法应该是继承AbstractPlatformTransactionManager
类,典型的样例就是JtaTransactionManager
和DataSourceTransactionManager
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
这是一个典型的采用模板方法设计的抽象类,定义了关于事务的核心处理流程。
到了下面的具体的子类实现,只需要简单的执行就好了,比如:DataSourceTransactionManager
类重写doCommit
和doRollback
方法只是简单的获取数据库连接后进行事务的提交或者回滚就好了。
前面通过分析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;
}
}
/**
TransactionManager
是TransactionTemplate
中的一个属性
整个execute
中几个关键的方法实际上都是在调用TransactionManager
中提供的方法,doInTransaction
则是执行业务代码的地方。
TransactionDefinition这个接口主要用来定义事务的传播行为、隔离级别、超时时间、是否只读等属性
Spring
为我们提供的TransactionTemplate
类,定义了事务处理的基本流程,对外暴露一个execute
方法,并通过传入一个标记性接口TransactionCallback
来实现使用者的业务逻辑处理,大大简化了使用方式。
而PlatformTransactionManager
则更加的灵活,它的目的主要是为了能够让使用者更加方便的在事务流程前后进行业务扩展,比如
它的实现类有:HibernateTransactionManager、JpaTransactionManager、JtaTransactionManager
,很明显就是针对不同的ORM框架而定制的。
所以定义TransactionTemplate
是为了让事务使用更加方便,定义PlatformTransactionManager
是为了让扩展更加的方便。