spring事务传播指一个service方法调用多个其他service的方法时事务的范围。即各个被调用的方法和调用者之间怎样处理数据库事务。

spring中共有七中事务类型:REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER、NESTED

本文将举例说明REQUIRED传播类型。

REQUIRED如果当前(上层调用者方法)没有事务,则自己新建一个事务,如果当前(上层调用者方法)存在事务,则加入这个事务spring默认使用该传播类型。

示例一:

// serviceA
@Transactional(propagation = Propagation.REQUIRED)
public void insertA() {mapperA.insert()
}// serviceB
@Transactional(propagation = Propagation.REQUIRED)
public void insertB() {mapperB.insert();throw new RuntimeException("抛出异常")    // 此处抛出异常类型需为RuntimeException(运行时异常)或子类才会实现事务的回滚,Exception并不会回滚
}// serviceC
@Transactional(propagation = Propagation.REQUIRED)
public void insertC() {mapperC.insert();
}public void test() {this.insertC();        // 此处并不会开启事务,spring事务最终使用的是AOP实现,这里this为serviceC对象,并不会被代理,所以@Transactional不会生效serviceA.insertA();    // 开启事务AserviceB.insertB();    // 开启事务B
}

在该示例中由于调用者方法中没有事务,所以serviceA.insertA()开启了事务A,serviceB.insertB()开启了事务B,

两个方法分别在两个事务中执行,A添加成功,B被回滚。

示例二

// serviceA
@Transactional(propagation = Propagation.REQUIRED)
public void insertA() {mapperA.insert()
}// serviceB
@Transactional(propagation = Propagation.REQUIRED)
public void insertB() {mapperB.insert()throw new RuntimeException("抛出异常")
}// serviceC
@Transactional(propagation = Propagation.REQUIRED)
public void insertC() {mapperC.insert()
}@Transactional(propagation = Propagation.REQUIRED)
public void test() {    // 开启事务AserviceA.insertA()    // 加入事务AserviceB.insertB()    // 加入事务A
}

在该示例中调用者方法开启了事务A,由于上层方法存在事务,所以serviceA.insertA()和serviceB.insertB()方法都加入了事务A,两个方法都被回滚。

示例三

// serviceA
public void insertA() {mapperA.insert()
}// serviceB
@Transactional(propagation = Propagation.REQUIRED)
public void insertB() {mapperB.insert()throw new RuntimeException("抛出异常")
}// serviceC
@Transactional(propagation = Propagation.REQUIRED)
public void insertC() {mapperC.insert()
}public void test() {    serviceA.insertA()    // 没有事务serviceB.insertB()    // 开启事务A
}

在该示例中,调用者方法没有事务,serviceA.insertA()不开事务执行,serviceB.insertB()开启事务A执行,结果A添加成功,B被回滚。

示例四

// serviceA
@Transactional(propagation = Propagation.REQUIRED)
public void insertA() {mapperA.insert();
}// serviceB
@Transactional(propagation = Propagation.REQUIRED)
public B insertB() {return mapperB.insert(B);
}
public void selectB(B) {mapperB.insert(B);
}// serviceC
@Transactional(propagation = Propagation.REQUIRED)
public void insertC() {mapperC.insert(C);
}@Transactional(propagation = Propagation.REQUIRED)
public void test1() {    // 开启事务AserviceA.insertA()    // 加入事务AB b serviceB.insertB()    // 加入事务AserviceB.selectB(b)   // 查询到serviceB.insertB()添加的数据,因为查询和添加在一个事务中
}public void test2() {    serviceA.insertA()    // 开启事务AB b = serviceB.insertB()    // 开启事务BserviceB.selectB(b)   // 查询不到serviceB.insertB()添加的数据,因为serviceB.insertB()添加操作和查询并不在一个事务中。
}

spring事务传播机制之《REQUIRED》相关推荐

  1. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  2. 原创 | CRUD更要知道的Spring事务传播机制

    来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...

  3. Spring事务传播机制大白话(使用springboot,注解演示)

    1. 我对传播机制的理解 为什么需要传播机制? 因为事务之间可能存在相互调用,例如service业务层的方法存在相互调用,如果相互调用的方法都开启了事务(对应到springboot就是在方法上要添加@ ...

  4. Spring 事务传播机制 实例讲解

    事务传播机制 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spring的管理的事务可以分为如下2 ...

  5. Spring事务传播机制以及事务嵌套

    Spring事务传播机制以及事务嵌套 Spring事务传播机制 事务嵌套场景 情景0: 场景1:不同类中,开启事务的方法调用没有开启事务的方法 场景2:不同类中,methodA方法嵌套methodB方 ...

  6. Spring事务传播机制和隔离级别

    Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非常的绕.如果栽在这上面,就实在是太可惜了. @Transactional(is ...

  7. Spring: 事务传播机制

    文章目录 1.美图 2.@Transactional 注解的属性信息 3.案例 3.1 建表 3.2 项目结构 3.3 配置 3.4 config 3.5 实体类 3.5 业务类 3.6 测试类 3. ...

  8. Spring事务传播机制与隔离机制

    详情查看 https://www.jianshu.com/p/249f2cd42692 转载于:https://www.cnblogs.com/alan319/p/10937089.html

  9. Spring事务与事务传播机制

    目录 1.事务的基本概念 2.Spring事务的实现 3.事务隔离级别 4.事务传播机制 1.事务的基本概念 关于事务的一些基础概念我已经在MYSQL中讲解过了,有不了解的可以移步至此篇文章: MyS ...

  10. java spring 事务传播_spring事务传播机制实例讲解

    天温习spring的事务处理机制,总结如下 对于SQL事务的概念以及ACID性质,可以参见我的另一篇博文 http://kingj.iteye.com/admin/blogs/1675011 spri ...

最新文章

  1. 【Java】阶乘 素数 循环
  2. 京东小程序上线,剑指何方?
  3. Cordova工程里android平台相关的index.html是怎么加载的
  4. 利用find同时查找多种类型文件
  5. 静态 static关键字
  6. 【英语学习】【Level 07】U04 Rest and Relaxation L4 A room fit for a king
  7. 大坑:用SQLyog连mysql的部分操作不能同步到从库
  8. matlab if语句小于等于,matlab的if语句运算符与或怎么用
  9. signature=56b13ba141d8042e7f17a5bffcc46d8e,vue 汉字转成拼音
  10. 荣耀笔记本linux版拆机,荣耀MagicBook Pro 16.1拆机有惊喜,官方都没提,居然能拓展...
  11. 渲染书籍目录汇总(不断更新中...)
  12. Asterisk内核 拾遗
  13. kerberos中的spn详解
  14. java pdf去水印_java使用spire.pdf去除水印
  15. Javascript深克隆和浅克隆
  16. 【信息汇总】重庆理工大学计算机考研
  17. 论文笔记及Pytorch复现:A Dual-Stage Attention-Based Recurrent Neural Network for Time Series Prediction
  18. 第13章 多进程编程
  19. python只会基础能做什么?---你可以做一个文字游戏!
  20. 黑马程序员_基础测试

热门文章

  1. 机器学习经典总结---入门必读----心血总结
  2. LRC 文件格式定义
  3. 一个简单的显示阴历的日历。
  4. 东北四省赛 Spell Boost
  5. python中Blowfish加密解密
  6. 电视台工作计算机管理,电视台工作岗位有哪些
  7. 六一儿童节(python)
  8. 破血伐木,千里追踪,梦幻奇游新法诀体验
  9. Hexo+Github搭建博客总结
  10. 计算机网络物理层测试