SpringJdbc学习笔记-03声明式事务

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;
  }

}
上一篇:8 Spring的事务处理


下一篇:血与泪的总结!从入门到核心实战,知乎上已获万赞