【有书共读】《Spring源码深度解读》第十章事务
在配置文件中<tx:annotation-driven/>。此配置是事务的开关,如果没有此配置,那么spring中将不存在事务的功能。
关键字annotation-driven,最终锁定TxNamespaceHandler类,此类中有init()方法。在其中又调用AnnotationDrivenBeanDefinitionParser类的parse方法进行解析。
二:事务增强器
TransactionInterceptor支撑着整个事务功能的架构,逻辑还是相对复杂的。TransactionInterceptor类继承自MethodInterceptor,所以调用该类从invoke方法开始。
在此方法中 主要有8个步骤
(1)获取事务属性。对于事务处理来说,最基础最首要的工作便是获取事务属性,这是支撑整个事务功能的基石,如果没有事务属性,其他功能也无从谈起。(见getTranscation方法)
(2)加载配置中配置的TransactionManager
(3)不同的事务处理方式采用不同的逻辑。(声明式事务创建见creatTranscationIfNecessary方法)
(4)在目标方法方法执行时获取事务并收集事务信息。(见dogetTranscation方法)
(5)执行目标方法。
(6)一旦出现异常,尝试异常处理。不是所有异常,spring都会讲其回滚,默认只对RuntimeException回滚。(见completeTranscationAfterThrowing方法)
(7)提交事务前的事务信息清除。(见cleanupAfterCompletion)