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

Posted Moon&&Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
  


以上是关于SpringJdbc学习笔记-03声明式事务的主要内容,如果未能解决你的问题,请参考以下文章

spring学习笔记声明式事务

学习笔记——Spring声明式事务管理;Spring中支持事务管理;使用声明式事务管理;Spring声明式事务管理属性

SpringJdbc学习笔记-02编程式事务

SpringJdbc学习笔记-02编程式事务

SpringJdbc学习笔记-04事务的传播和隔离

SpringJdbc学习笔记-04事务的传播和隔离