隔離級別是指若干個併發的事務之間的隔離程度。TransactionDefinition 接口中定義了五個表示隔離級別的常量:spring
所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲。在TransactionDefinition定義中包括了以下幾個表示傳播行爲的常量:數據庫
這裏須要指出的是,前面的六種事務傳播行爲是 Spring 從 EJB 中引入的,他們共享相同的概念。而 PROPAGATION_NESTED是 Spring 所特有的。以 PROPAGATION_NESTED 啓動的事務內嵌於外部事務中(若是存在外部事務的話),此時,內嵌事務並非一個獨立的事務,它依賴於外部事務的存在,只有經過外部的事務提交,才能引發內部事務的提交,嵌套的子事務不能單獨提交。若是熟悉 JDBC 中的保存點(SavePoint)的概念,那嵌套事務就很容易理解了,其實嵌套的子事務就是保存點的一個應用,一個事務中能夠包括多個保存點,每個嵌套子事務。另外,外部事務的回滾也會致使嵌套子事務的回滾。express
所謂事務超時,就是指一個事務所容許執行的最長時間,若是超過該時間限制但事務尚未完成,則自動回滾事務。在 TransactionDefinition 中以 int 的值來表示超時時間,其單位是秒。編程
事務的只讀屬性是指,對事務性資源進行只讀操做或者是讀寫操做。所謂事務性資源就是指那些被事務管理的資源,好比數據源、 JMS 資源,以及自定義的事務性資源等等。若是肯定只對事務性資源進行只讀操做,那麼咱們能夠將事務標誌爲只讀的,以提升事務處理的性能。在 TransactionDefinition 中以 boolean 類型來表示該事務是否只讀。併發
一般狀況下,若是在事務中拋出了未檢查異常(繼承自 RuntimeException 的異常),則默認將回滾事務。若是沒有拋出任何異常,或者拋出了已檢查異常,則仍然提交事務。這一般也是大多數開發者但願的處理方式,也是 EJB 中的默認處理方式。可是,咱們能夠根據須要人爲控制事務在拋出某些未檢查異常時任然提交事務,或者在拋出某些已檢查異常時回滾事務。性能
聲明式事務實現方式主要有3種,一種爲基於AOP方式的聲明式事務【基於TransactionProxyFactoryBean】,一種爲基於AspectJ的聲明式事務【一種爲經過使用Spring的<tx:advice>定義事務通知與AOP相關配置實現】,另爲一種經過@Transactional註解實現事務管理實現,下面詳細說明2種方法如何配置,已經相關注意點spa
<!-- <tx:advice>定義事務通知,用於指定事務屬性,其中「transaction-manager」屬性指定事務管理器,並經過<tx:attributes>指定具體須要攔截的方法 <tx:method>攔截方法,其中參數有: name:方法名稱,將匹配的方法注入事務管理,可用通配符 propagation:事務傳播行爲, isolation:事務隔離級別定義;默認爲「DEFAULT」 timeout:事務超時時間設置,單位爲秒,默認-1,表示事務超時將依賴於底層事務系統; read-only:事務只讀設置,默認爲false,表示不是隻讀; rollback-for:須要觸發回滾的異常定義,可定義多個,以「,」分割,默認任何RuntimeException都將致使事務回滾,而任何Checked Exception將不致使事務回滾; no-rollback-for:不被觸發進行回滾的 Exception(s);可定義多個,以「,」分割; --> <tx:advice id="advice" transaction-manager="transactionManager"> <tx:attributes> <!-- 攔截save開頭的方法,事務傳播行爲爲:REQUIRED:必需要有事務, 若是沒有就在上下文建立一個 --> <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="" read-only="false" no-rollback-for="" rollback-for=""/> <!-- 支持,若是有就有,沒有就沒有 --> <tx:method name="*" propagation="SUPPORTS"/> </tx:attributes> </tx:advice> <!-- 定義切入點,expression爲切人點表達式,以下是指定impl包下的全部方法,具體以自身實際要求自定義 --> <aop:config> <aop:pointcut expression="execution(* com.kaizhi.*.service.impl.*.*(..))" id="pointcut"/> <!--<aop:advisor>定義切入點,與通知,把tx與aop的配置關聯,纔是完整的聲明事務配置 --> <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> </aop:config>
2)方式二經過@Transactional實現事務管理代理
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="txManager"/> //開啓事務註解
3.注意事項code
* 若是配置了聲明式事務,在出現運行時異常時,事務會回滾,可是出現非運行時異常時,事務不回滾。blog
* 若是配置了編程式事務,則無論出現什麼異常,事務都會回滾。