疑问:@Transactional 属性对事务的控制作用是什么?
...
接着Insight tx:annotation-driven 解析,事务处理过程中解析Transactional 属性进行逻辑控制。
主要分析jdbc事务的控制以及事务的隔离级别应用。
...
注释即文档,TransactionAspectSupport 清晰的实现事务处理的分界,开启事务的流程直接看注释就非常清楚了。
// @see TransactionAspectSupport
// 使用策略设计模式,事务的管理交给PlatformTransactionManager
// 标准的事务处理步骤,开启事务、commit/rollback
protected Object invokeWithinTransaction(Method method, Class targetClass, final InvocationCallback invocation) throws Throwable {
// 1.获取事务的属性信息 Transactional ann = AnnotationUtils.getAnnotation(ae, Transactional.class);
// @see SpringTransactionAnnotationParser
final TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
// 2.决定使用哪种策略 JTA/JDBC/Hibernate/JPA/jDO...
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
final String joinpointIdentification = methodIdentification(method, targetClass);
if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
// 3.开启事务 core!!!
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
Object retVal = null;
try {
// 4.业务方法调用
retVal = invocation.proceedWithInvocation();
}
catch (Throwable ex) {
// 5.rollback target invocation exception
completeTransactionAfterThrowing(txInfo, ex);
throw ex;
}
finally {
// 7.reset threadlocal 事务信息
cleanupTransactionInfo(txInfo);
}
// 6.commit
commitTransactionAfterReturning(txInfo);
return retVal;
}
// ...case: CallbackPreferringPlatformTransactionManager
}/**
* Abstract base class that implements Spring's standard transaction workflow
*
* This base class provides the following workflow handling:
* 1.determines if there is an existing transaction;
* 2.applies the appropriate propagation behavior;
* 3.suspends and resumes transactions if necessary;
* 4.checks the rollback-only flag on commit;
* 5.applies the appropriate modification on rollback (actual rollback or setting rollback-only);
* 6.triggers registered synchronization callbacks (if transaction synchronization is active).
*
*/
public final TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException {
Object transaction = doGetTransaction();
// Cache debug flag to avoid repeated checks.
boolean debugEnabled = logger.isDebugEnabled();
if (definition == null) {
// Use defaults if no transaction definition given.
definition = new DefaultTransactionDefinition();
}
if (isExistingTransaction(transaction)) {
// Existing transaction found -> check propagation behavior to find out how to behave.
return handleExistingTransaction(definition, transaction, debugEnabled);
}
// Check definition settings for new transaction.
if (definition.getTimeout() < TransactionDefinition.TIMEOUT_DEFAULT) {
throw new InvalidTimeoutException("Invalid transaction timeout", definition.getTimeout());
}
// No existing transaction found -> check propagation behavior to find out how to proceed.
if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_MANDATORY) {
throw new IllegalTransactionStateException("No existing transaction found for transaction marked with propagation 'mandatory'");
}
else if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {
SuspendedResourcesHolder suspendedResources = suspend(null);
try {
// look here! 初始/正常情况从这里开始处理
boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);
DefaultTransactionStatus status = newTransactionStatus(definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);
doBegin(transaction, definition);// begin transaction策略
prepareSynchronization(status, definition);
return status;
} catch (RuntimeException ex) {
resume(null, suspendedResources);
throw ex;
} catch (Error err) {
resume(null, suspendedResources);
throw err;
}
}
}
Insight DataSourceTransactionManager 开启事务的过程:
a.根据Transactional.isolation() 设置connection 事务隔离级别;
b.设置connection.autoCommit 为false,sql statement 以group形式执行。
...
总结:
Transactional.propagation 体现在获取事务对象的控制;
Transactional.isolation 设置session 的事务隔离级别;
设计借鉴:
策略模式,事务的创建和开启委托给不同的TransactionManager实现,eg: JTA/JDBC/Hibernate/JPA/jDO。