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;
}
原文地址:https://www.cnblogs.com/xiaozhang666/p/13648398.html