案例挑战——事务传播行为

这篇具有很好参考价值的文章主要介绍了案例挑战——事务传播行为。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景介绍

此前在项目开发过程中,使用到了事务的传播行为。但是大多数情况下都是使用的事务默认的传播行为required。但是其实还有其他的传播行为。所以特地的回顾和学习了事务的多种传播行为。本篇博客从5w2h的角度来对事务的传播行为进行学习和实践。

二、 什么是事物的传播行为

事务的传播行为其实指的是事务在多个方法之间的传播方式和规则。
例如:当一个方法调用另一个方法时,如果这两个方法都涉及事务操作,事务的传播行为定义了如何处理这些嵌套的事物,以及事务如何在方法调用之间传播和管理。

备注:事务:在计算机语言中指访问并可能更新数据库中数据项的一个程序执行单元。

常见的事物传播行为

对事务的要求程度可以从大到小排序:mandatory / supports / required / requires_new / nested / not supported / never

mandatory

要求当前存在事务,否则抛出异常。该传播特性适用于必须在事务中执行的方法,如果没有事务存在,则会抛出异常。

supports

如果当前存在事务,则加入该事务,如果没有事务,则以非事务方式执行。该传播特性适用于不要求事务支持的方法,它会根据当前的事务上下文决定是否执行事务。

required

如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这是最常见的选择,也是Spring默认的事务传播行为。(required需要,没有新建,有则加入)。

required_new

创建新事务,无论当前存不存在事务,都创建新事务。(requires_new需要新的,不管有没有,直接创建新事务)

nested

如果当前存在事务,则在嵌套事务中执行。如果没有事务,则创建一个新的事务。嵌套事务是当前事务的一部分,可以回滚独立于主事务的操作。如果主事务回滚,嵌套事务也会回滚;如果嵌套事务回滚,主事务可以选择回滚或继续执行。

not support

以非事务方式执行方法,如果当前存在事务,则将其挂起。该传播特性适用于不希望方法在事务中执行的情况,它会暂停当前事务,以非事务方式执行方法。

never

要求当前不存在事务,否则抛出异常。该传播特性适用于必须在非事务方式下执行的方法,如果当前存在事务,则会抛出异常。

三、为什么要有事务的传播行为,它是为了解决什么问题?

事务的传播行为,是为了解决多个方法调用中涉及到事务管理的问题,通过定义事务的传播行为,可以控制事务在不同方法之间的行为方式。
解决了多个方法之间事务管理、嵌套事务、隔离性和一致性等问题。

四、如何使用事务的传播行为

目前以spring框架举例,举例spring支持的事务。通过使用@Transactional注解实现。

外围方法没有事务,内围方法有事务。

  1. 添加@Transactional注解的两个业务层方法
@Transactional(propagation = Propagation.REQUIRED )
    @Override
    public List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent) {
        return courseContentMapper.queryCourseContentRecord(courseContent);
    }
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public List<CourseContentEntity> queryCourseContentByCreateList(List<String> createByList) {
        return courseContentMapper.queryCourseContentByCreateList(createByList);
    }
  1. 测试代码
@Test
	void contextLoads() {
		CourseContentEntity courseContent=new CourseContentEntity();
		courseContent.setCreatedBy("张三");
		
		courseContentService.queryCourseContent(courseContent);
		List<String> createNames=new ArrayList<>();
		createNames.add("张三");
		createNames.add("李四");
		createNames.add("王五");
		courseContentService.queryCourseContentByCreateList(createNames);
		throw new RuntimeException();
	}
  1. 结果
    通过下面图片可以看到,queryCourseContent方法和queryCourseContentByCreateList方法都成功执行了。当前外围的异常管不着内围的方法。
    案例挑战——事务传播行为,并发编程,JAVA,java,数据库,spring

外围方法有事务,内围方法有事务。

  1. 添加@Transactional注解的两个业务层方法
@Transactional(propagation = Propagation.REQUIRED )
    @Override
    public List<CourseContentEntity> queryCourseContent(CourseContentEntity courseContent) {
        return courseContentMapper.queryCourseContentRecord(courseContent);
    }
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public List<CourseContentEntity> queryCourseContentByCreateList(List<String> createByList) {
        return courseContentMapper.queryCourseContentByCreateList(createByList);
    }
  1. 测试方法
@Transactional(propagation = Propagation.REQUIRED)
	@Test
	void contextLoads() {
		CourseContentEntity courseContent=new CourseContentEntity();
		courseContent.setCreatedBy("张三");

		courseContentService.queryCourseContent(courseContent);
		List<String> createNames=new ArrayList<>();
		createNames.add("张三");
		createNames.add("李四");
		createNames.add("王五");
		courseContentService.queryCourseContentByCreateList(createNames);
		throw new RuntimeException();
	}

结果:通过下方图片可以看到并没有像上次打印出执行的sql语句来,
内围方法和外围方法均属于同一事务,只要一个方法回滚,整个事务均回滚。
案例挑战——事务传播行为,并发编程,JAVA,java,数据库,spring

备注:其他类型的事务传播行为,可以按照上方的测试的方式进行验证。

五、总结

  1. 通过对于上方事务各种传播行为的认识和实践之后,在具体的项目中相对于之前,更加能够进行灵活应用。
  2. 后续会对本地事物和分布式事物进行认知和实践将经历转换为自己的经验。

六、升华

1.针对于spring的@Transactional的实现原理(动态代理)之后需要进行学习和实践。文章来源地址https://www.toymoban.com/news/detail-529409.html

  1. 通过5w2h的方法,能够从不同维度去认知任何事物。将其进行刻意练习,成为高效学习的习惯。

到了这里,关于案例挑战——事务传播行为的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

    目录 一、事务的相关配置 1. 添加测试标签 2. 添加对应方法 3. 测试 二、事务的传播行为 三、事务的隔离级别 四、注解配置声明式事务 1. 注册事务注解驱动 2. 加上注解 3. 配置类代替xml文件中的注解事务支持 4. 测试 往期专栏文章相关导读  1. Maven系列专栏文章 2. Mybatis系列专

    2024年02月08日
    浏览(45)
  • 聊一聊数据库事务的那些事(隔离级别,传播行为)

      我们平时使用事务的时候,可能脑子里面想到和事务有关的知识点无非就是,ACID,事务隔离级别那一套,使用的事务也就是是通过注解的形式,或者手动开启事务。更细致一点的问题或许没有深究下去,比如事务的传播行为,注解形式和手动事务的区别等,今天我们就这几

    2024年02月07日
    浏览(57)
  • spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?

    Spring工程的启动流程主要包括以下几个步骤: 加载配置文件:Spring会读取配置文件(如XML配置文件或注解配置)来获取应用程序的配置信息。 实例化并初始化IoC容器:Spring会创建并初始化IoC容器,即ApplicationContext。在这一步,Spring会解析配置文件,并将配置的Bean实例化。

    2024年02月12日
    浏览(38)
  • 深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn

    2024年03月21日
    浏览(83)
  • Java设计模式之行为型-状态模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不

    2024年02月16日
    浏览(40)
  • Java设计模式之行为型-命令模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、点餐案例  五、总结 1、将一个请求封装为一个对象,使您可以用不同的请求对客户进行参数化。 2、对请求排队或记录请求日志,以及支持可撤销的操作。 3、将命令对象与执行命令的对象分离,

    2024年02月16日
    浏览(37)
  • Java设计模式之行为型-责任链模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、在Java中实现 4.2、在SpringBoot中实现  五、总结  责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和

    2024年02月15日
    浏览(39)
  • Java设计模式之行为型-迭代器模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 迭代器模式是一种常用的设计模式,它主要用于遍历集合对象,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 举个简单的比喻,聚合对象像一个存放苹果的篮子,迭代

    2024年02月16日
    浏览(46)
  • 【Java探索之旅】掌握数组操作,轻松应对编程挑战

    🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 掌握数组的基本操作对于编写高效的程序至关重要。本文将深入探讨数组的一些常见操作,包括数组转字符串、数组拷贝、求平均值、顺序查找、二分查找、数组排序等。通过学习这些操作,

    2024年04月27日
    浏览(49)
  • Java并发编程:Semaphore

    信号量可以控制线程的并发数量 通常用于那些资源有明确访问数量限制的场景,常用于限流 。 使用 Semaphore 先调用 acquire() 获取,然后通过 try ... finally 保证在 finally 中释放。 Semaphore常用方法说明 acquire() 获取一个令牌,在获取到令牌、或者被其他线程调用中断之前线程一直

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包