Spring事务处理浅析
类层次结构
在Spring的事务处理模块中.可以看到的类层次结构如图:
可以看到,Spring事务处理模块是通过AOP功能来实现声明式事务处理的,比如事务属性的配置和读取,事务对象的抽象等。因此,在Spring事务处理中,可以通过设计一个
TransactionProxyFactoryBean
来使用AOP
功能,通过这个TransactionProxyFactoryBean
可以生成Proxy
代理对象,在这个代理对象中,通过Transactionlnterceptor
来完成对代理方法的拦截,正是这些AOP
的拦截功能,将事务处理的功能编织进来。在Spring事务处理中,在实现声明式事务处理时,这是AOP和IoC模块集成的部分。对于具体的事务处理实现,比如事
务的生成、提交、回滚、挂起等,由于不同的底层数据库有不同的支持方式,因此,在Spring事务处理中,对主要的事务实现做了一个抽象和适配。适配的具体事务处理器包括:对DataSource数据源的事务处理支持,对Hibernate数据源的事务处理支持,对JDO数据源的事务处理支持,对JPA和JTA等数据源的事务处理支持等。这一系列的事务处理支持,都是通过设计PlatformTransactionManager
,AbstractPlatforTransactionManager
以及一系列具体事务处理器来实现的,而PlatformTransactionManager
又实现了TransactionInterceptor
接口,通过这样一个接口实现设计,就把这一系列的事务处理的实现与前面提到的TransactionProxyFactoryBean结合起来,从而形成了一个Spring声明式事务处理的设计体系。
事务处理的实现过程
声明式事务处理的实现大致可以分为以下几个部分:
读取和处理在IoC容器中配置的事务处理属性,并转化为Spring事务处理需要的内部数据结构。具体来说,这里涉及的类是
TransactionAttributeSourceAdvisor
,从名字可以看出,它是一个AOP通知器,Spring使用这个通知器来完成对事务处理属性值的处理。处理的结果是,在IoC容器中配置的事务处理属性信息,会被读入并转化成TransactionAttribute
表示的数据对象,这个数据对象是Spring对事物处理属性值的数据抽象,对这些属性的处理是和TransactionProxyFactoryBean
拦截下来的事务方法的处理结合起来的。Spring事务处理模块实现统一的事务处理过程。这个通用的事务处理过程包含处理事务配置属性,以及与线程绑定完成事务处理的过程.Spring通过
Transactioninfo
和TransactionStatus
这两个数据对象,在事务处理过程中记录和传递相关执行场景。底层的事务处理实现。对于底层的事务操作,Spring委托给具体的事务处理器来完成,这些具体的事务处理器,就是在IoC容器中配置声明式事务处理时,配置的
PlatformTransactionManager
的具体实现,比如DataSourceTransactionManager
和HibernateTransactionManager
等。
具体的分析,这里就不说了,感兴趣的话可以以这个大致的思路去看源码。