Spring事務這個東西比以前的AOP和MVC都要複雜的多,並且Spring聲明式的事務是很是經常使用的一個功能.java
一.事務定義和併發問題spring
事務是指一段操做由幾個部分組成,要麼全完成,要不所有撤銷.事務的特性主要是:一致性,原子性,隔離性.持久性.數據庫
二.事物的隔離級別express
併發使用事務的時候會出現各類問題,有人分析過,主要是5種狀況,,3種讀問題:髒讀,不可重複讀,幻象讀.2種寫問題:第一類丟失更新,第二類丟失更新.爲了解決這些事務併發所產生的問題,數據庫實現了事務的隔離級別,通常狀況下數據庫都支持4種,有的最低級是不支持的. READ UNCOMMITTED,READ COMMITED,REPEATABLE READ,SERIALIZABLE,他們對5中事務併發解決能力以下圖所示:併發
三.事務的傳播特性ui
事務傳播特性是指當A事務遇到B事務的時候如何處理.事務傳播特性主要用這幾個REQUIRED,SUPPORTS,MANDATORY,REQUIRES_NEW,NOT SUPPORTED,NEVER,NESTED
spa
Required:當前若是存在事務就加入進去,若是沒有事物就新建事務code
Supports:當前若是存在事務就加入,不存在事務就以非事物的方式運行事務
Mandatory:當前若是存在事務就加入,若是不存在事務就拋出異常
get
Not_supported : 當前存在事務就掛起.
Required_New:當前若是不存在事務就建立事務,若是存在就掛起當前事務
Never:不以事務的方式運行,若是存在事務就拋出異常.
Nested:若是存在事務則嵌套到當前事務中,若是不存在事務則新建一個事務.
四.Spring XML配置事物
<!-- 配置事物管理器 這個是jdbc的事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <aop:config proxy-target-class="true"> <!-- 定義切面 --> <aop:pointcut expression="execution(* com.lubby.service.impl.*.* (..))" id="serviceMethod" /> <!-- 引用事務加強 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /> </aop:config> <!-- 事務加強 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 事務屬性定義 --> <tx:attributes> <tx:method name="add*" propagation="REQUIRED" isolation="READ_UNCOMMITTED" rollback-for="Excption" /> </tx:attributes> </tx:advice>
advice中的propagation是指事務的傳播特性,isolation是指事務的隔離級別.rollback-for是遇到什麼類型的異常進行回滾