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){
//此處省略轉賬方法的業務細節
}
}