1. 程式人生 > >Spring 宣告式事務

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 不觸發事務回滾。