Insight spring @Transactional 属性解析应用

疑问:@Transactional 属性对事务的控制作用是什么?

...

接着Insight tx:annotation-driven 解析,事务处理过程中解析Transactional 属性进行逻辑控制。

主要分析jdbc事务的控制以及事务的隔离级别应用。

参考:MySQL事务隔离级别详解

...

注释即文档,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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值