zoukankan      html  css  js  c++  java
  • Spring的事务控制,注解和xml配置以及解释

    了解MySql事务 https://www.cnblogs.com/xiaozhang666/p/13446981.html

    事务传播行为

    我们的事务往往加载service层方法上,那么我们现在的业务简单些,直接service调用dao层方法,以后可能涉及service层方法A()直接调用service层方法B()。那么此时A()和B()都有自己的事务控制,那么相互调用的时候就会有问题,A和B应该有一个关于事务的协商机制,这种机制就叫做事务的传播行为。

    • REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

    • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

    • MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

    • REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

    • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起 NEVER:以非事务方式运行,如果当前存在事务,抛出异常

    • NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。

    Spring的事务机制

    Spring的事务机制是Spring给我们提供的一套事务管理的方式,项目中我们就不需要手动去控制事务了

    声明式事务:通过配置,在不侵犯原有业务逻辑代码的基础上,添加事务控制功能,这种方式叫做声明式事务;(这里的Spring声明式事务控制,是基于AOP实现)

    • 编程式事务:原生事务操作,我们的事务控制逻辑(增强逻辑)和业务逻辑混合在一起,比如我们之前的控制转账 事务,这种方式就叫做编程式事务.
    • Spring的事务管理器PlatformTransactionManager接口,实现类:org.springframework.jdbc.datasource.DataSourceTransactionManager 使用Spring JDBC或MyBatis 进行持久化数据时使用

    使用到的xml标签

    <aop:config> 
    标签作用: 所有的aop配置都在其中,本质是基于AOP实现的事务管理
    
    <aop:advisor> 
    配置外部的事务增强切面
    advice-ref 属性用来注入事务声明唯一id
    pointcut="execution(* com.itheima.service.*.*(..))" 切入点表达式含义: 拦截所有业务层的类的所有的方法。
    
    <tx:advice> 
    事务通知增强切面
    id 属性 : 当前通知切面的id唯一标识 注入到advice-ref中
    transaction-manager属性 : 事务管理器

      <tx:attributes

       配置事务的属性

    <tx:method> 
    切入点拦截方法的事务控制设置
    isolation 属性 : 设置事务的隔离级别 DEFAULT采取数据默认的隔离级别:
      -mysql: repeatable read
      -Oracle: read committed
    propagation 属性 : 设置事务的传播行为
      -required:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
    是为带事务的操作加带增删改的操作
      -supports:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)**
    read-only 属性 : 设置当前的事务,是否为只读事务
    rollback-for 属性 : 设置当前事务,出现什么异常回滚。如果不设置,出现任何异常都回滚
    no-rollback-for 属性 : 设置事务,出现什么异常不回滚。如果不设置,出现任何异常都回滚
    timeout 属性 : 超时时间 -1 永不超时
    
    例如
    <tx:method name="transfer" isolation="DEFAULT" propagation="SUPPORTS" read-only="false" rollback-for="" no-rollback-for="" timeout="-1"/>

    代码实现

    注入DataSourceTransactionManager 事务管理器

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"></bean>
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       <property name="dataSource" ref="dataSource"></property>
    </bean>

     配置事务管理

    <aop:config>
       <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.spring.service.UserServiceImpl.*(..))"/>
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
           <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED"/>
           <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED"/>
           <tx:method name="find*" isolation="DEFAULT" propagation="SUPPORTS"/>
      </tx:attributes>
    </tx:advice>

    此时  execution(* com.spring.service.UserServiceImpl.*(..))  表达式匹配的方法已经具有事务控制的功能。

    扩展 - 事务控制的注解使用

    在注解开发中可以注释掉 <aop:config> 和  <tx:advice> 标签,但是要保留事务管理器注入 DataSourceTransactionManager。

    @Transactional() 注解作用 : 开启当前方法的事务支持
    transactionManager 属性: 设置事务管理器,如果不设置默认是transactionManager
    isolation属性: 设置事务的隔离级别
    propagation属性: 事务的传播行为

    然后将注解写到service层中需要事务控制的方法上。

    @Override
    @Transactional(transactionManager = "transactionManager", isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
    public Integer saveUser(User user) {
       Integer integer = userMapper.saveUser(user);
       return integer;
    }
  • 相关阅读:
    旅行
    赛道修建
    逃学的小孩
    hdu4035_概率dp
    hdu4405_概率dp
    poj2096_概率dp
    poj3420_找规律+矩阵快速幂
    poj2411_状压dp
    poj3744_矩阵快速幂
    hdu5720_贪心
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13648398.html
Copyright © 2011-2022 走看看