0


Spring——Spring事务的实现方式及传播特性

  • Spring事务的特性及隔离级别同事务,详情请见事务——什么是事务,事务的特性,事务的隔离级别_醉酒的戈多的博客-CSDN博客

一、Spring事务的实现方式及原理

1.实现方式

在使用Spring框架的时候,有以下两种事务的实现方式:

  1. 编程式事务:用户自己通过代码来控制事务的处理逻辑
  2. 声明式事务:通过@Transactional注解来实现

​ 事务的操作本来应该是由数据库来进行控制,但是为了方便用户进行业务逻辑的操作,spring对事务功能进行了扩展实现,一般很少会用编程式事务,更多的是通过添加@Transactional注解来进行实现,当添加此注解之后事务的自动功能就会关闭,有spring框架来帮助进行控制。

2.实现原理

    Spring的事务操作是AOP的一个核心体现,当一个方法添加@Transactional注解之后,spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当使用这个代理对象的方法的时候,如果有事务处理,那么会先把事务的自动提交给关系,然后去执行具体的业务逻辑,如果执行逻辑没有出现异常,那么代理逻辑就会直接提交,如果出现任何异常情况,那么直接进行回滚操作,当然用户可以控制对哪些异常进行回滚操作。

二、Spring事务的传播特性

    当使用@Transactional注解实现事务时,且多个事务方法相互调用时,事务如何在这些方法之间进行传播。spring中提供了7中不同的传播特性,来保证事务的正常执行。具体使用方式如下:
@Transactional(propagation = Propagation.REQUIRED)
public int saveUser(User user){
    scoreDao.save(**);
    return userDao.save(user);
}

Spring事务的7中传播特性:

  • ​ REQUIRED:默认的传播特性,如果当前没有事务,则新建一个事务,如果当前存在事务,则加入这个事务

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_REQUIRED,则如果A方法上有事务,B就用A的事务,没有的话,B就自己新建一个事务。

  • ​ SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,则以非事务的方式执行

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_SUPPORTS,则如果A方法上有事务,B就用A的事务,没有的话,B就以非事务方式执行。

  • ​ MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_MANDATORY,则要求A方法上有事务,有的话,B用A的事务。A没有的话,就报错。

  • ​ REQUIRED_NEW:创建一个新事务,如果存在当前事务,则挂起该事务

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_REQUIRES_NEW,则如果A方法上有事务,则将A方法的事务挂起,B用自己的事务。A方法没有事务的话,B自己就新建一个事务。

  • ​ NOT_SUPPORTED:以非事务方式执行,如果存在当前事务,则挂起当前事务

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NOT_SUPPORTED,则如果A方法上有事务,则将A方法的事务挂起(因为A、B方法是在同一个线程中执行的)以非事务方式执行,以非事务方式执行。A没有事务,就以非事务方式执行。

  • ​ NEVER:不使用事务,如果当前事务存在,则抛出异常

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NEVER,则要求A方法上不能有事务,有的话,就报错。A没有事务,就以非事务方式执行,B始终是以非事务方式执行。

  • ​ NESTED:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样

方法A中调用方法B,B方法的事务传播设置为PROPAGATION_NESTED,则如果A方法上有事务,则B方法的事务嵌套在A方法事务中。A方法没有事务的话,B自己就新建一个事务。

** NESTED与REQUIRED和REQUIRED_NEW的区别如下:**

​ NESTED和REQUIRED_NEW的区别:

​ REQUIRED_NEW是新建一个事务并且新开始的这个事务与原有事务无关,而NESTED则是当前存在事务时会开启一个嵌套事务,在NESTED情况下,父事务回滚时,子事务也会回滚,而REQUIRED_NEW情况下,原有事务回滚,不会影响新开启的事务

​ NESTED和REQUIRED的区别:

​ REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。

标签: spring java

本文转载自: https://blog.csdn.net/DreamEhome/article/details/128862184
版权归原作者 醉酒的戈多 所有, 如有侵权,请联系我们删除。

“Spring——Spring事务的实现方式及传播特性”的评论:

还没有评论