文章目录
TransactionManager Diagram
接口定义
这是一个空接口,既没有定义方法,也没有提供常量.这只是为了统一传统方式(PlatformTransactionManager)和reactive方式(ReactiveTransactionManager),这两个子接口类似,都是定义了三个,方法名和入参一致,只是返回值reactive的是Mono的类型
下面详细说下接口中对着三个方法的规定
getTransaction
这个接口用于获取一个transaction,可能是已有的,也可能是新增的.根据入参配置来.入参配置是一个接口,包含了配置项以及这个配置项范围,具体代码如下
TransactionDefinition
public interface TransactionDefinition {
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int ISOLATION_READ_UNCOMMITTED = 1;
int ISOLATION_READ_COMMITTED = 2;
int ISOLATION_REPEATABLE_READ = 4;
int ISOLATION_SERIALIZABLE = 8;
int TIMEOUT_DEFAULT = -1;
default int getPropagationBehavior() {return PROPAGATION_REQUIRED;}
default int getIsolationLevel() {return ISOLATION_DEFAULT;}
default int getTimeout() {return TIMEOUT_DEFAULT;}
default boolean isReadOnly() {return false;}
@Nullable
default String getName() {return null;}
static TransactionDefinition withDefaults() {return StaticTransactionDefinition.INSTANCE;}
}
final class StaticTransactionDefinition implements TransactionDefinition {
static final StaticTransactionDefinition INSTANCE = new StaticTransactionDefinition();
private StaticTransactionDefinition() {}
}
getPropagationBehavior
这个是获取事务的传播方式,根据当前有无事务来采取不同的措施
当前有事务 | 当前无事务 | |
---|---|---|
PROPAGATION_REQUIRED | 沿用 | 创建 |
PROPAGATION_SUPPORTS | 沿用 | 不创建 |
PROPAGATION_MANDATORY | 沿用 | 异常 |
PROPAGATION_REQUIRES_NEW | 挂起后创建 | 创建 |
PROPAGATION_NOT_SUPPORTED | ||
PROPAGATION_NEVER | 异常 | 不创建 |
PROPAGATION_NESTED | 创建内嵌 | 创建 |
对PropagationBehavior更进一步的研究可以参见SpringBoot中的Transaction研究(二)PropagationBehavior
getIsolationLevel
至于隔离级别是老生常谈,有兴趣的可以参见On Transaction系列
需要注意的是如果沿用了当前的事务,那么隔离级别这个配置是不会生效的
isReadOnly
这个是用于优化时的配置项,与其他配置项不同,如果不支持可以直接忽略,而对于其他配置项如果不支持则要抛异常.
commit
提交当前的事务,然后针对上面隔离级别采用不同的措施,例如恢复刚挂起的事务
需要注意的是commit也有可能失败,这个时候需要由TransactionManager自动rollback(或者无需rollback)
rollback
一般用于捕获异常后回滚,不包括commit的异常
Abstract帮助类
AbstractPlatformTransactionManager是一个帮助类,是PlatformTransactionManager的实现类,按照文档说明,建议自己实现PlatformTransactionManager的也继承这个抽象类,因为它已经解决了一个状态不对的问题,所以集成类只需要专心做doXXX即可。
另外还有一个AbstractReactiveTransactionManager是ReactiveTransactionManager的实现类,其中代码差不多,只是使用了reactive的语法。
属性
AbstractPlatformTransactionManager里面有以下属性并且提供了getter和setter
private int transactionSynchronization = SYNCHRONIZATION_ALWAYS;
private int defaultTimeout = TransactionDefinition.TIMEOUT_DEFAULT;
private boolean nestedTransactionAllowed = false;
private boolean validateExistingTransaction = false;
private boolean globalRollbackOnParticipationFailure = true;
private boolean failEarlyOnGlobalRollbackOnly = false;
private boolean rollbackOnCommitFailure = false;
getTransaction
抛开里面的默认值,整个对于不同类型的PropagationBehavior的调用不同的方法
综上所述,最终结果出了抛出异常外就是startTransaction和prepareTransactionStatus。这两个方法也很类似,第一步都是创建一个DefaultTransactionStatus对象作为返回值,最后一步都是通过调用*prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition)*把相关参数设置到TransactionSynchronizationManager里面的ThreadLocal里。只是startTransaction还有额外的一步也就是它的第二步,调用了doBegin这个抽象方法。
commit & rollback
通过上面的图可以看出来最终也是走向了processCommit和processRollback这两个方法。我们清除里面的记录日志的代码后结果如下
实现类R2dbcTransactionManager
这个实现类里实现了各种doXXX,其中doCommit和doRollback都是通过得到Connection然后调用相应方法来实现,而doSetRollbackOnly是通过status得到ConnectionFactoryTransactionObject然后调用其setRollbackOnly来实现