3.2 声明式事务
典型的SpringAOP的实现,基于AOP,所以一定要把aop的依赖都导入
什么叫声明式:
3.2.1 导入命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
3.2.2 配置事务管理器
<!--Spring提供的基于数据源的事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
3.2.3 配置声明式事务
<!--声明式事务配置,配置事务管理器-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--配置对应方法的事务处理-->
<tx:attributes>
<!--配置testTransactionUpdate2的配置-->
<tx:method name="testTransactionUpdate2"/>
<!--配置以find开头的全部方法,只读-->
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
3.2.4 配置aop代理
配置AOP来对声明式事务作用的范围进行限定
<!--配置aop-->
<aop:config>
<!--配置切点,表达式匹配到多个类的全部方法-->
<aop:pointcut id="pointcut" expression="execution(* com.moon.dao.*Dao.*(..))"/>
<!--引入声明式事务通知和切点-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
3.2.5 使用注解配置声明式事务
配置文件中开启注解支持:
<!--启用注解驱动声明事务,配置事务管理器-->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--开启组件扫描-->
<context:component-scan base-package="com.moon"/>
在使用的方法上或者类上面使用
@Transactional
注解,如果在类上和方法上同时规定了注解,就近原则,以方法级别为准
// 在方法上使用Transactional注解
@Transactional(rollbackFor = {Exception.class})
public void testTransactionUpdate2() {
for (int i = 0; i < 10; i++) {
if (i == 5) {
throw new RuntimeException("无缘无故的异常");
}
Student student = new Student(null, "小月月", "湖北武汉" + i, 20);
insert(student);
}
}
注意:如果异常在方法内被try catch处理了,那么事务会失效,接收不到异常就会提交
@Transactional(rollbackFor = {Exception.class})
public void testTransactionUpdate2() {
// 在内部使用try
try {
for (int i = 0; i < 10; i++) {
if (i == 5) {
throw new RuntimeException("无缘无故的异常");
}
Student student = new Student(null, "小月月", "湖北武汉" + i, 20);
insert(student);
}
}catch (Exception e){
// 把异常捕获到以后,没有继续抛出,那么事务是不知道发送了异常,所以会失效,这里如果捕获到了异常,一定要抛出
System.out.println(e.getMessage());
// 抛出异常
// throw e;
}
}