spring提供了可配置、易擴展的事務處理框架,本文主要從一下幾個方面說明spring事務的原理java
在同時進行多個事務的時候,可能會出現髒讀、不可重複讀、幻讀四種狀況,數據庫分別有四種隔離級別處理這些狀況。Spring中TransactionDefinition定義了事務的隔離級別和傳播屬性,隔離級別有spring
傳播屬性:定義了多層事務時候的行爲,spring的TransactionDefinition定義了7種事務傳播行爲數據庫
spring支持編程式事務,也支持聲明式事務,這裏以聲明式事務的配置爲例。編程
在配置事務管理器的時候配置爲使用cglib生成代理框架
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
上面xml配置的做用spa
# tx命名空間的處理類 org.springframework.transaction.config.TxNamespaceHandler # annotation-driven標籤的解析類 org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser # 解析標籤annotation-driven的方法 org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser.AopAutoProxyConfigurer#configureAutoProxyCreator
解析該標籤的時候作了如下的事代理
上面解析標籤的時候注入的這些bean在getBean的時候會起做用,在getBean的時候會判斷是否須要返回包裝後的bean,也就是org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary方法,找到全部的advisor(順便完成初始化),而後判斷找出全部能夠應用到該類的advisor(org.springframework.aop.support.AopUtils#findAdvisorsThatCanApply),而後利用可用的advisor建立proxy(org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy),這個proxy就是原來類的代理,在請求該類的方法的時候是經過代理進行的,在代理中會判斷是否有事務,是否須要開啓事務code
Spring 事務處理是基於AOP實現的,爲事務方法所在類生成一個代理類,在調用事務方法的時候實際會調用代理類的代理方法,這裏就是component
org.springframework.transaction.interceptor.TransactionInterceptor#invoke
在看spring事務處理流程以前,咱們先回顧下直接使用jdbc編程的時候使用事務的流程xml
spring事務處理的流程也基本類似,只是作了一些封裝
spring事務在屏蔽了一些繁瑣邏輯的同時,也提供了比較好的擴展性,好比支持自定義數據源,自定義事務管理器,並且支持在事務執行先後加入本身的回調用方法。