您的位置:首页 > 编程语言 > Java开发

spring 事务源码分析

2016-10-10 15:11 429 查看
xml配置方式使用事务

<tx:annotation-driven transaction-manager="sqlTransactionManager" proxy-target-class="true" />


解释几个配置

mode 可以使用proxy和aspectj,默认是proxy,下面讲的都是默认的情况,即proxy

TxNamespaceHandler#init方法注册了AnnotationDrivenBeanDefinitionParser,

registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());


AnnotationDrivenBeanDefinitionParser

AnnotationDrivenBeanDefinitionParser注册了InfrastructureAdvisorAutoProxyCreator以及下面所示3个类



注:其实aop配置与事务配置共存的状态下不会使用InfrastructureAdvisorAutoProxyCreator,参考http://blog.csdn.net/u011686226/article/details/52785420

BeanFactoryTransactionAttributeSourceAdvisor



AnnotationTransactionAttributeSource



AnnotationTransactionAttributeSource就是解析事务的属性,通过getTransactionAttribute方法返回一个TransactionAttribute

TransactionInterceptor

TransactionInterceptor就是真正执行事务的地方,

DataSourceTransactionManager#doGetTransaction

获取事务,返回DataSourceTransactionObject(对于DataSourceTransactionManager)



DataSourceTransactionObject包含了一个ConnectionHolder,这个ConnectionHolder是从当前线程获取的(利用threadlocal)

(ConnectionHolder) TransactionSynchronizationManager.getResource(this.dataSource);

DataSourceTransactionManager#isExistingTransaction

判断是否已经存在事务,利用ConnectionHolder#transactionActive属性

AbstractPlatformTransactionManager#handleExistingTransaction

对于已经存在的事务处理,比如挂起,或者在同一个事务执行,要看具体配置

AbstractPlatformTransactionManager#suspend

事务的挂起
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: