SPRing對于數據庫的事務管理,是通過事務管理器進行操作,以下為兩大類配置方法:
一、基于xml配置文件:
<!-- 1,配置事務管理器(根據情況使用合適的事務管理器) --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 2,配置管理事務的通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 配置方法與事務的關系 --> <tx:attributes> <!-- 指定add,delete,update都開啟事務 --> <tx:method name="save*"/> <tx:method name="delete*"/> <tx:method name="update*"/> <!-- 只讀事務 --> <tx:method name="query*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 3,配置AOP --> <aop:config> <!-- 切面 --> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.stephen..*Service*.*(..))"/> </aop:config>注意點:
1、配置了切面的切入點pointcut后,只是攔截了對應的方法,并沒有做任何動作,需要再通知中加入tx:attribute 和 tx:method約定需要開啟事務的方法;
2、在匹配的方法中,直接具有事務管理功能,無需再進行硬編碼;
二、基于注解方式進行事務管理
<!-- 1,配置事務管理器(根據情況使用合適的事務管理器) --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 2,開啟使用注解方式管理事務 --> <tx:annotation-driven transaction-manager="transactionManager"/>注意點:1、注解方式同樣需要先配置事務管理器;
2、告知Spring容易,需要使用注解方式來進行事務管理;
3、在需要事務管理的方法或者類上使用@Transactional 注解修飾, 方法上的注解優先于類上的;
三、事務傳播行為
一個業務方法中如果存在多個事務嵌套一起,默認情況下事務會同時作用,如果需要事務獨立作用,例如日志事務,其他事務出錯后,日志事務仍生效,則需要使用事務傳播行為。
1、注解方式中@Trasactional的屬性propagation,其中有
傳播行為:定義關于客戶端和被調用方法的事物邊界
傳播行為 | 意義 |
REQUIRED (默認值) | 業務方法需要在一個事務中運行。如果方法運行時,已經處在一個事務中,那么加入到該事務,否則為自己創建一個新的事務 |
NOT_SUPPORTED | 聲明方法不需要事務。如果方法沒有關聯到一個事務,容器不會為它開啟事務。如果方法在一個事務中被調用,該事務會被掛起,在方法調用結束后,原先的事務便會恢復執行 |
REQUIRES_NEW | 屬性表明不管是否存在事務,業務方法總會為自己發起一個新的事務。如果方法已經運行在一個事務中,則原有事務會被掛起,新的事務會被創建,直到方法執行結束,新事務才算結束,原先的事務才會恢復執行 |
MANDATORY | 該屬性指定業務方法只能在一個已經存在的事務中執行,業務方法不能發起自己的事務。如果業務方法在沒有事務的環境下調用,容器就會拋出例外。 |
SUPPORTS | 這一事務屬性表明,如果業務方法在某個事務范圍內被調用,則方法成為該事務的一部分。如果業務方法在事務范圍外被調用,則方法在沒有事務的環境下執行 |
Never | 指定業務方法絕對不能在事務范圍內執行。如果業務方法在某個事務中執行,容器會拋出例外,只有業務方法沒有關聯到任何事務,才能正常執行 |
NESTED | 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按REQUIRED屬性執行.它使用了一個單獨的事務, 這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。它只對DataSourceTransactionManager事務管理器起效 |
在日志方法中使用@Transactional(propagation = Propagation.REQUIRES_NEW) ,則可以完成,當其他事務回滾時,日志方法仍生效;
新聞熱點
疑難解答