一、前言
Spring提供了聲明式事務處理機制,它基於AOP實現,無須編寫任何事務管理代碼,所有的工作全在配置文件中完成。
二、聲明式事務的XML配置方式
為業務方法配置事務切面,需要用到tx和aop兩個命名空間下的標簽,先在Spring配置文件中導入這兩個命名空間。
1、配置事務管理器組件
事務管理器組件提供對事務處理的全面支持和統一管理,在切面中相當於增強處理的角色。這里使用Spring提供的事務管理器類DataSourceTransactionManager來實現,如下
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
配置DataSourceTransactionManager時,要為其注入事先定義好的數據源組件
2、配置事務增強
通過<tx:advice>標簽配置事務增強,綁定事務管理器並針對不同方法定義事務規則
<tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="find*" propagation="SUPPORTS"/> <tx:method name="add*" propagation="REQUIRED"/> <tx:method name="del*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
其中transaction-manager屬性引用和一個事務管理器Bean,transaction-manager屬性的默認值是transactionManager,也就是說,如果定義的事務管理器Bean的名稱是transactionManager,則可以不用指定該屬性值
通過<tx:attributes>子標簽定制事務屬性,事務屬性通過<tx:method>標簽進行設置。Spring支持對不同的方法設置不同的事務屬性所以可以為一個<tx:advice>設置多個<tx:method>
<tx:method>標簽中的name屬性是必需的,用於指定匹配的方法。若要對方法名進行約定,可以使用通配符(*)。其他屬性均為可選,用於指定具體的事務規則,如下
暫時省略......
3、配置切面
最后還要定義切面,將事務增強與方法切入點結合,將事務規則應用到指定的方法上
<!-- 定義切面 --> <aop:config> <!-- 定義切入點 --> <aop:pointcut id="serviceMethod" expression="execution(* edu.cn.service..*.*(..))"/> <!-- 將事務增強與切入點結合 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/> </aop:config>
aop:advisor的advice-ref屬性引用的是通過<tx:advice>標簽設定了事務屬性的組件
三、聲明式事務的注解添加方式
Spring還支持使用注解配置聲明式事務,所使用的注解是@Transactional。首先仍然需要在Spring配置文件中配置事務管理器,並添加對注解配置的事務的支持,如下
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="txManager"/>
經過上述配置,程序便支持使用@Transactional注解來配置事務了
import org.springframework.transaction.annotation.Transaction import org.springframework.stereotype.Service; @Transaction @Service("userService") public class UserServiceImpl implements UserService{ @Autowired private UserMapper userMapper; @Override @Transaction(propagation = Propagation.SUPPORTS) public List<User> findUsersWithConditions(User user){ //省略 } @Override public boolean addNewUser(User user){ //省略 } }
在業務類上添加@Transactional注解即可為該類的所有業務方法統一添加事務處理。如果某一業務方法需要采用不同的事務規則,可以在該業務方法上添加@Transactional注解進行單獨設置。
@Transactional注解也可以設置事務屬性的值,默認的@Transactional設置如下
暫時省略......
這些默認值當然也是可以改變的,如下