Spring 事務控制配置

Spring 事務控制配置

一、基於xml的聲明式事務控制

步驟:
1.配置事務管理器

2.配置事務的通知
(1)需要導入事務的約束:tx名稱空間和約束,同時導入aop的名稱空間和約束。
(2)使用tx:advice標籤配置事務通知
屬性:id:該事務通知的唯一標識;transaction-manager:給事務通知提供一個事務管理器的引用。

3.配置AOP中的通用切入點表達式

4.建立事務通知和切入點表達式的對應關係

5.配置事務的屬性(在tx:advice標籤的內部)

<!-- 數據源的配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDartaSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc.mysql://localhost:3306/zjj" />
	<property name="username" value="root" />
	<property name="password" value="root" />
</bean>

<!-- (步驟1)配置事務管理器 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!-- 注入數據源 -->
	<property name="dataSource" ref="dataSource">
</bean>

<!-- (步驟2)配置事務的通知,引入上面定義的txManager -->
<tx:advice id="txAdvice" transaction-manager="txManager">
	<!-- (步驟5)此處配置事務的屬性
		isolation:用於指定事務的隔離級別。默認值是DEFAULT,表示使用數據庫的默認隔離級別。
		propagation:用於指定事務的傳播行爲。默認值是REQUIED(增刪改的選擇),表示一定會有事務。查詢方法可以選擇SUPPRORTS。
		read-only:用於指定事務是否只讀。只有查詢方法才能設置爲true,默認值是false表示讀寫。
		timeout:用於指定事務的超時時間,默認值是-1,表示永不超時。如果設置了數值,以秒爲單位。
		rollback-for:用於指定一個異常,當產生該異常時,事務回滾;產生其他異常時,事務不回滾。沒有默認值,表示任何異常都回滾。
		mo-rollback-for:用於指定一個異常,當產生該異常時,事務不回滾;產生其他異常時,事務回滾。沒有默認值,表示任何異常都回滾。
	-->
	<tx:attritbutes>
		<!-- 指定業務層方法的事務通知的屬性,name爲業務層類中的方法名 -->
		<!-- 增刪改方法:讀寫的配置(統一配置,優先級低) -->
		<tx:method name="*" propagation="REQUITED" read-only="false"/>
		<!-- 查詢方法:只讀的配置(定製配置,優先級高) -->
		<tx:method name="find" propagation="SUPPORTS" read-only="true"/>
	</tx:attritbutes>
</tx:advice>

<!-- 配置aop -->
<aop:config>
	<!-- (步驟3)配置切入點表達式 -->
	<aop:pointcut id="pt1" expression="execution(* com.itjj.service.impl.*.*(..))" />
	<!-- (步驟4)建立切入點表達式和事務通知的對應關係 -->
	<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>
</aop:config>

二、基於註解的聲明式事務控制

步驟:
1.配置事務管理器 --xml
2.開啓spring對註解事務的支持 --xml
3.在需要事務支持的地方使用@Transactional註解 --java類和方法

xml的配置(步驟1,2)

<!-- 數據源的配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDartaSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc.mysql://localhost:3306/zjj" />
	<property name="username" value="root" />
	<property name="password" value="root" />
</bean>

<!-- 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!-- 注入數據源 -->
	<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 開啓spring對註解事務的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

java類中的註解配置(步驟3)

/**
*事務控制應該都是在業務層
*/
@Service("accountService")
//只讀事務的配置(用於查詢)
@Transaction(propagation=Propagation.SUPPORTS,readOnly=true)
public class AccountServiceImpl implements IAccountService{

	@Autowried
	private IAccountDao accountDao;

	@override
	public Account findAccountById(Integer accountId){
		return account.findAccountById(accountId);
	}

	//此處配置讀寫型事務配置,用來覆蓋類上的只讀配置(用於增、刪、改)
	@Transaction(propagation=Propagation.REQUIRED,readOnly=false)
	@Override
	public void transfer(String sourceName, String targetName, Float money){
		//此處省略轉賬方法的業務細節
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章