1. 程式人生 > >Spring宣告式事務管理、事務的傳播行為xml配置

Spring宣告式事務管理、事務的傳播行為xml配置

 1. <tx:method name="insert*" propagation="REQUIRED" />中name的值是ServiceImpl中各個要加入事物管理的方法的方法名。

<!--  
	 	 事務管理: Spring宣告式事務管理 。
	 	 spring預設的事務隔離級別是用的資料庫的預設事務隔離級別,不同資料庫級別也不盡相同。
	 	 使用事務,要引入aop和tx的名稱空間 :即檔案頭第4行。
	 	(開啟註解事務,使用時在方法上加上註解@Transactional(...)即可 )
	-->
	<!-- 事務管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- 通知傳播行為 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="upd*" propagation="REQUIRED" />
			<!-- 只讀表示對資料的操作是讀取,報異常後不用回滾(不是隻讀的資料出異常,事務會回滾)。 -->
			<tx:method name="select*" propagation="SUPPORTS" read-only="true" />
			<tx:method name="get" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>
	
	<!-- 配置事務切入點 -->
	<aop:config>
	    <aop:pointcut id="servicePointcut" expression="execution(* com.service.impl..*ServiceImpl.*(..))"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
	</aop:config>

2.  儘量把邏輯操作程式碼寫到Service中,controller是沒有納入spring的事務管理的。出現異常不會回滾。

3. 相關說明:


spring中PROPAGATION類的事務屬性詳解
    PROPAGATION_REQUIRED: 
    支援當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。 
    PROPAGATION_SUPPORTS:  
    支援當前事務,如果當前沒有事務,就以非事務方式執行。 
    PROPAGATION_MANDATORY:   
    支援當前事務,如果當前沒有事務,就丟擲異常。 
    PROPAGATION_REQUIRES_NEW: 


    新建事務,如果當前存在事務,把當前事務掛起。
    PROPAGATION_NOT_SUPPORTED:
    以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 
    PROPAGATION_NEVER:       
    以非事務方式執行,如果當前存在事務,則丟擲異常。 
    PROPAGATION_NESTED:  
    支援當前事務,如果當前事務存在,則執行一個巢狀事務,如果當前沒有事務,就新建一個事務。