@EnableTransactionManagement
我們經常使用@EnableTransactionManagement開啟事務, 這個注解導入一個類,@Import(TransactionManagementConfigurationSelector.class), 會在spring容器增加兩個bean,
AutoProxyRegistrar和ProxyTransactionManagementConfiguration.
AutoProxyRegistrar
給容器注冊InfrastructureAdvisorAutoProxyCreator的bean, 這個bean繼承AbstractAdvisorAutoProxyCreator, 也是一個BeanPostProcessor. 這個類可以開啟代理功能, 初始化后執行代理邏輯.
ProxyTransactionManagementConfiguration
是一個配置類, 給容器注冊了下面三個bean
- BeanFactoryTransactionAttributeSourceAdvisor: 一個advisor
- TransactionAttributeSource: 相當于PointCut
- TransactionInterceptor: 相當于advice, 里面的invoke方法就是增強邏輯
invokeWithinTransaction
開啟事務的核心方法
- 獲取@Transactional屬性
- 從容器獲取TransactionManager的bean對象
- 根據傳播行為判斷是否開啟新事物, ThreadLocal實現
- 執行下一個Interceptor或被代理對象中的方法
- 如果拋異常回滾事務
- 否則就提交事務
- 清除ThreadLocal