Spring 宣告式事務
事務傳播機制
propagation:事務傳播機制有如下幾種:
REQUIRED:預設值,表示如果存在一個事務,則支援當前事務;如果沒有事務,則開啟一個新事務。
REQUIRES_NEW:表示總是開啟一個新的事務,如果一個事務已經存在,則將這個存在的事務掛起,開啟新事務執行該方法。
MANDATORY:表示如果存在一個事務,則支援當前事務;如果當前沒有一個活動的事務,則丟擲異常。
NESTED:表示如果當前存在一個活動的事務,則建立一個事務作為當前事務的巢狀事務執行;如果沒有當前事務,該取值與REQUIRED相同。
SUPPORTS:表示如果存在一個事務,則支援當前事務;如果當前沒有事務,則按非事務方法執行。
NOT_SUPPORTED:表示總是以非事務方式執行,如果一個事務已經存在,則將這個存在的事務掛起,然後執行該方法。
NEBER:表示總是以非事務方式執行,如果當前存在一個活動的事務,則丟擲異常。
事務隔離等級
isolation:事務隔離等級,即當前事務和其他事務的隔離程度,在併發事務處理的情況下需要考慮它的設定。
DEFAULT:預設值,表示使用資料庫預設的事務隔離級別。
READ_UNCOMMITTED:未提交讀。
READ_COMMITTED:提交讀。
REPEATABLE_READ:可重複讀。
SEROALIZABLE:序列讀。
timeout:事務超時時間。
允許事務執行的最長時間,以秒為單位,超過指定的時間自動回滾,防止事務執行時間過長而影響系統性能。該屬性需要底層的實現支援。預設值:-1,表示不超時。
read-only:事務超時時間,允許是否為只讀,預設值:false。
對於只用於查詢的功能事務,設定為true,能提高事務處理的效能。
rollback-for:設定能夠觸發回滾的異常型別。Spring 預設只在丟擲 Runtime Exception 才標識事務回滾。
可以通過全限定類名自行指定需要回滾事務的異常,多個類名用英文逗號隔開。
no-rollback-for:設定不觸發回滾的異常。Spring 預設 checked Exception 不會觸發事務回滾。
可以通過全限定類名自行指定不需回滾事務的異常,多個類名用英文逗號隔開,設定完事務規則,最後還要定義切面,將事務規則應用到指定的方法上。
一、在spring配置檔案配置事務
<!-- 定義事務管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事務傳播特性 -->
<tx:advice id="tAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 事務的傳播特性 -->
<!--SUPPORTS 支援當前事務,如果當前沒有事務,就使用無事務 -->
<!--REQUIRED 支援當前事務,如果沒有事務則新建事務,預設值-->
<!--REQUIRES_NEW 如果有當前事務,則掛起當前事務,新建新事務,反之,直接新建事務-->
<!--MANDATORY 支援當前事務,如果沒有事務,則丟擲異常-->
<!--timeout 事務超時時間 預設值是-1,-1表示不超時,以秒為單位-->
<!--read-only 事務是否只讀,預設值是false,-->
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="get*" propagation="SUPPORTS"/>
<tx:method name="add*"/>
<tx:method name="del*"/>
<tx:method name="upd*"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="Transactional" expression="execution(* seriver.*.*(..))"/>
<aop:advisor advice-ref="tAdvice" pointcut-ref="Transactional"/>
</aop:config>
二、使用註解方式實現事務:
spring配置檔案新增如下程式碼:
<!-- 定義事務管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 將事務管理器交予spring
* transaction-manager 配置事務管理器
* proxy-target-class
true : 底層強制使用cglib 代理
-->
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
1、業務邏輯實現類上 新增@Transactional 註解
2、方法體上 新增@Transactional 註解,這個權重會比上一種大。
預設的@Transactional設定:
事務傳播特性是:PROPAGATION_REQUIRED
事務隔離級別是:ISOLATION_DEFAULT
事務是讀/寫
Runtime Exception 觸發回滾,checked Exception 不觸發事務回滾。