SpringBoot中的Transaction研究(一)TransactionManager

TransactionManager Diagram

TransactionManager Diagram

接口定义

这是一个空接口,既没有定义方法,也没有提供常量.这只是为了统一传统方式(PlatformTransactionManager)和reactive方式(ReactiveTransactionManager),这两个子接口类似,都是定义了三个,方法名和入参一致,只是返回值reactive的是Mono的类型

PlatformTransactionManager
下面详细说下接口中对着三个方法的规定

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即可。
另外还有一个AbstractReactiveTransactionManagerReactiveTransactionManager的实现类,其中代码差不多,只是使用了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的调用不同的方法

Y
N
NEVER
NOT_SUPPORTED
REQUIRES_NEW
NESTED
Y
N
Y
N
MANDATORY
REQUIRED,REQUIRES_NEW,NESTED
Other
Other
Y
N
begin
isExistingTransaction
getPropagationBehavior
getPropagationBehavior
throw Exception
prepareTransactionStatus
startTransaction
isNestedTransactionAllowed
useSavepointForNestedTransaction
isValidateExistingTransaction...

综上所述,最终结果出了抛出异常外就是startTransactionprepareTransactionStatus。这两个方法也很类似,第一步都是创建一个DefaultTransactionStatus对象作为返回值,最后一步都是通过调用*prepareSynchronization(DefaultTransactionStatus status, TransactionDefinition definition)*把相关参数设置到TransactionSynchronizationManager里面的ThreadLocal里。只是startTransaction还有额外的一步也就是它的第二步,调用了doBegin这个抽象方法。

commit & rollback

Y
N
isLocalRollbackOnly
commit
status.isCompleted
throw Exception
config
processRollback
!shouldCommitOnGlobalRollbackOnly&defStatus.isGlobalRollbackOnly
processRollback
else
processCommit
rollback

通过上面的图可以看出来最终也是走向了processCommitprocessRollback这两个方法。我们清除里面的记录日志的代码后结果如下

processCommit AbstractPlatformTransactionManager TransactionSynchronizationUtils TransactionSynchronization impl prepareForCommit void triggerBeforeCommit triggerBeforeCommit beforeCommit void loop [every synchronization] void opt [status isNewSynchronization] void triggerBeforeCompletion triggerBeforeCompletion beforeCompletion void loop [every synchronization] void opt [status isNewSynchronization] void doCommit void opt [status isNewTransaction] triggerAfterCompletion invokeAfterCompletion afterCompletion void loop [every synchronization] void invokeAfterCompletion afterCompletion void loop [every synchronization] void alt [!status.hasTransaction || status.isNewTransaction] [!synchronizations.isEmpty] alt [status isNewSynchronization] void triggerAfterCompletion void triggerBeforeCompletion void opt [!beforeCompletionInvoked] doRollbackOnCommitException doRollback void doSetRollbackOnly void alt [status.isNewTransaction] [status.hasTransaction] triggerAfterCompletion void alt [UNEXPECTED_ROLLBACK] [TRANSACTION_EXCEPTION] [RUNTIME_OR_ERROR] triggerAfterCommit void cleanupAfterCompletion void triggerAfterCompletion void processCommit AbstractPlatformTransactionManager TransactionSynchronizationUtils TransactionSynchronization impl

实现类R2dbcTransactionManager

这个实现类里实现了各种doXXX,其中doCommit和doRollback都是通过得到Connection然后调用相应方法来实现,而doSetRollbackOnly是通过status得到ConnectionFactoryTransactionObject然后调用其setRollbackOnly来实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值