当前位置: 首页 > news >正文

Springboot 跟着我了解下 事务 @Transactional 默认方式 Propagation.REQUIRED

 

在平常的项目里面,最常看到的就是使用注解  @Transactional   去操作事务。

 

如果稍微对spring事务有过了解的,会知道关于事务传播机制,存在7种,

也就是:

同样可以在注解@Transactional里面看到, 默认配置了的是  Propagation.REQUIRED (文章的主角)

 

 

 

为什么该篇文章,7种,我只介绍一种呢?而且是介绍的是 PROPAGATION_REQUIRED 呢?
 

因为从上文大家已经知道,默认啥都不指定的时候,我们使用的就是PROPAGATION_REQUIRED这种方式。

往往很多小伙伴在使用声明式事物的时候,就顶多加上一个异常指定,都是使用的默认传播机制变量,所以如果连这个方式都不了解的话,那也太不应该了。

我们日常操作里,对于单个方法使用事物,经常是这样:

	
    @Transactional(rollbackFor = Exception.class)
    public Boolean add(UserInfo userInfo) {
        
        //... 业务处理
        //... 业务处理
        //... 业务处理

       //手动抛异常 触发回滚等
        retrun xxx;
    }

或者说配合手动回滚使用,是这样:

	
    @Transactional(rollbackFor = Exception.class)
    public Boolean add(UserInfo userInfo) {
        
       try {
          
          //....业务逻辑处理
          
          if(XXXX){
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return false;
          }
          //....业务逻辑处理
          
          if(xxxxx){
                 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                 return false;
          }
          

        } catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }
    }

以上都是单个事物方法,理解起来很简单,相信大多数场景大家就这么用一下就没有过多去理会了。

 

那么接下来就是关于 这种默认的事物传播机制  PROPAGATION_REQUIRED 我们需要关心的东西了。

 

在结合代码介绍前,先把结论贴出来: 

1.如果外部方法没有开启事务的话,Propagation.REQUIRED(默认就是)修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。


2.如果外部方法开启事务并且指定为Propagation.REQUIRED(默认就是),所有Propagation.REQUIRED修饰的内部方法和外部方法均属于同一事务 ,只要一个方法回滚,整个事务均回滚,因为大家都加入到了外部设置的这个事务里了。

 

第一种情形:

第一个业务类里面的方法,使用了声明式事务:

class testOne  
{
    @Transactional(rollbackFor = Exception.class)
    public Boolean addOne(UserInfo userInfo) {
        
        //... 业务处理
        //... 业务处理
        //... 业务处理
        retrun xxx;
    }
    
}

第二个业务类里面的方法,也使用了声明式事务:

class testTwo  
{
    @Transactional(rollbackFor = Exception.class)
    public Boolean addTwo(UserInfo userInfo) {
        
        //... 业务处理
        //... 业务处理
        //... 业务处理
        retrun xxx;
    }
    
}

然后第三个业务类里面的方法没有使用声明式事务,去调用第一个和第二个,如:

class testThree  
{
    
    public Boolean testThree(UserInfo userInfo) {
        
        addOne(xxxx);
        addTwo(xxxx);
        retrun xxx;
    }
    
}

这种情况下,addOne和addTwo两个方法的事务都是各自独立的, 也就是说,就算addOne成功了,在执行addTwo的时候出现了异常进行了回滚,并不会影响到addOne的数据。

 

 

那么,在默认addOne和addTwo都使用了事务,而且都是默认指定的传播机制PROPAGATION_REQUIRED的时候,我们想达到,只要这两个方法,或者testThree 方法,其中一个出现异常触发回滚,都可以将这三个方法一起进行回滚。那应该怎么做?

第二种情形:

让它们都加入到一个事务里面:

class testThree  
{
    @Transactional(rollbackFor = Exception.class)
    public Boolean testThree(UserInfo userInfo) {
        
        addOne(xxxx);
        addTwo(xxxx);
        retrun xxx;
    }
    
}

在testThree方法(对于addOne 和 addTwo 来说是个外部方法)上同样使用声明式事物,且也是默认指定传播机制PROPAGATION_REQUIRED。 

这样addOne事物开启时,发现外部存在指定传播机制PROPAGATION_REQUIRED的事物,那么就会加入该事物;

同样addTwo同理。

 

 

ok,简单的介绍就到此(在看完这篇,是否对事务传播的设置有了兴趣? 有的话就开始手动去做点测试,都去试试各自传播机制的情形,这样才能更灵活的去运用起来)。 

 

相关文章:

  • Springboot 全局日期格式化,只需要几行小代码
  • springboot 上传文件设置文件大小限制
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • Springboot 自定义注解+AOP简单实例介绍
  • Java 将Map的toString格式字符串转为 Map
  • Java 细品 重写equals方法 和 hashcode 方法
  • Java 对象的克隆Clone和必须了解的浅拷贝与深拷贝
  • Java i++ 与 ++i
  • Java try 与 finally 对于返回值的影响
  • 手撕一道算法题 在你面前有一个n阶的楼梯,你一步只能上1阶或2阶。请问,当N=11时,你可以采用多少种不同的方式爬完这个楼梯();当N=9时呢?
  • Springboot 整合tk-mybatis , 妈妈,我再也不想敲CRUD的代码了!
  • 【硬着头皮】你还在用size来判断集合是否为空?
  • 【硬着头皮】PageHelper 必须用来分页?
  • Java 使用LRUmap设计一个简单的缓存场景
  • MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
  • 【知识碎片】第三方登录弹窗效果
  • co.js - 让异步代码同步化
  • GitUp, 你不可错过的秀外慧中的git工具
  • Javascript Math对象和Date对象常用方法详解
  • MySQL QA
  • Ruby 2.x 源代码分析:扩展 概述
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 好的网址,关于.net 4.0 ,vs 2010
  • 悄悄地说一个bug
  • 入手阿里云新服务器的部署NODE
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #Linux(帮助手册)
  • $ git push -u origin master 推送到远程库出错
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (6)添加vue-cookie
  • (C语言)共用体union的用法举例
  • (Git) gitignore基础使用
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (一)VirtualBox安装增强功能
  • (一)基于IDEA的JAVA基础12
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ****Linux下Mysql的安装和配置
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET CLR Hosting 简介
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET是什么
  • .Net组件程序设计之线程、并发管理(一)
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [1]-基于图搜索的路径规划基础
  • [20150321]索引空块的问题.txt
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [BT]BUUCTF刷题第9天(3.27)
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)