前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Transactional注解不生效案例

Transactional注解不生效案例

作者头像
CBeann
发布于 2023-12-25 10:50:02
发布于 2023-12-25 10:50:02
53000
代码可运行
举报
文章被收录于专栏:CBeann的博客CBeann的博客
运行总次数:0
代码可运行

源码下载

ChaiRongD/Demooo - Gitee.com

不生效场景1:try-catch捕获了

不生效原因:内部逻辑把异常捕获吞了,所以不生效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Transactional
 public void transactionalNotEffect01() {
    try {
      Person p1 = new Person();
      p1.setName(LocalDateTime.now().toString());
      personDao.insertSelective(p1);
      int i = 1 / 0;
    } catch (Exception e) {
      e.printStackTrace();
      System.out.println("my error");
    }
  }

不生效场景2:方法不使用public修饰

不生效原因:他会判断是不是public,源码中明确规定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class StudentService {

  @Autowired private PersonDao personDao;


  // 不生效2
  @Transactional
  protected void transactionalNotEffect02() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    int i = 1 / 0;
  }
  
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class TransactionalNotEffect02Controller {

  @Autowired private StudentService studentService;

  @GetMapping("/transactionalNotEffect02")
  public Object getAll(){
      studentService.transactionalNotEffect02();
    return 1;
  }
}

不生效场景3:通过this调用,没有走代理方法

不生效原因:自己掉自己的方法,这样方式不会走代理,所以事务失效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 不生效3
  public void transactionalNotEffect03() {
    this.addPerson();
  }

  @Transactional
  public void addPerson() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    int i = 1 / 0;
  }
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class StudentController {

  @Autowired private StudentService studentService;

  @GetMapping("/transactionalNotEffect03")
  public Object transactionalNotEffect03() throws Exception {
    studentService.transactionalNotEffect03();
    return 1;
  }
}

不生效场景4:@Transactional 注解属性 propagation 设置错误

不生效原因:见下面的

参考:Spring中propagation的7种事务配置_sayoko06的博客-CSDN博客_propagation

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Service
public class StudentService {

  @Autowired private PersonDao personDao;

  // 不生效4
  @Transactional(propagation= Propagation.NOT_SUPPORTED)
  public void transactionalNotEffect04() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    int i = 1 / 0;
  }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("/transactionalNotEffect04")
  public Object transactionalNotEffect04() throws Exception {
    studentService.transactionalNotEffect04();
    return 1;
  }

不生效场景5:@Transactional的rollbackFor 属性与实际异常不匹配

根本原因:rollbackFor属性监听的是RuntimeException,而下面的代码是FileNotFoundException。不是父子关系,没有交集,匹配失败,所以事务失效。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  @Transactional(propagation = Propagation.REQUIRED,rollbackFor = RuntimeException.class)
  public void transactionalNotEffect05() throws Exception{
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    //不存在的文件
    int read = new FileInputStream(new File("D://尚硅谷周阳老师//1.txt")).read();
  }

不生效场景6:数据库引擎不支持事务

不生效场景7:线程不同不支持事务

不生效原因:事务回滚的单位是建立在connection上,而connection是存在ThreadLocal中,因为不同的线程ThreadLocal存的connection自然不一样,那该场景就不符合预期(都回滚)了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  // 不生效7
  @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  public void transactionalNotEffect07() {
    Person p1 = new Person();
    p1.setName(LocalDateTime.now().toString());
    personDao.insertSelective(p1);
    new Thread(
            () -> {
              Person p2 = new Person();
              p2.setName(LocalDateTime.now().toString());
              personDao.insertSelective(p2);
              int i = 1 / 0;
            },
            "t1")
        .start();
  }

参考

1 尚硅谷周阳老师分享

2 Spring中propagation的7种事务配置_sayoko06的博客-CSDN博客_propagation

3 @Transactional注解不起作用解决办法及原理分析_嘎嘎的博客-CSDN博客_@transactional 不生效

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
阿里四面:你能让Spring@Transactional注解在事务下不生效吗?
然后我们还需要一个Dao,来操作user表。在 site.nemo.dao 包下新建一个UserDao类:
Java程序猿
2021/06/08
4000
一口气说出 6种,@Transactional注解的失效场景
昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败。所以今天简单的和大家分享一下@Transactional相关的知识。
程序员小富
2020/03/19
1.8K0
一口气说出 6种,@Transactional注解的失效场景
详细整理Spring事务失效的具体场景及解决方案
实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制;好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Spring事务失效的场景,希望开发过程尽量避免踩坑,造成时间精力的浪费。 溪源按照最基本的使用方式以及常见失效场景优先级整理,先简单介绍一下具体失效场景:
沁溪源
2020/09/02
1.2K0
@Transactional注解使用以及事务失效的场景
数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
政采云前端团队
2023/09/28
2.3K0
@Transactional注解使用以及事务失效的场景
Spring 事务传播行为使用与源码分析
我们知道在 Java 项目当中,在一次的接口调用时可能存在多个 DML 行为,而每一次的 DML 行为都可以单独的作为一次事务,所以有了事务的传播行为我们可以更加细粒度的控制这些方法对数据所造成的影响。想要控制就可以把调用内容拆分成多个方法分配不同的传播行为。
啵啵肠
2023/11/17
2630
SpringBoot的事务传播机制
@Transactional(propagation = Propagation.REQUIRED)
袁新栋-jeff.yuan
2020/08/26
2.4K0
Spring之事务传播行为
首先简单了解一下Spring中事务传播行为是什么?听起来很高端,但是真正用起来的时候,稍有不慎,就会让自己陷入困境之中,所以在使用之前,我们必须要十分耐心认真的学习它。 从名字理解起来,事务传播行为,既然为传播就肯定发生在两个实体之间,否则单个实体又如何发生行为呢。通俗点讲就是“一个巴掌拍不响”。下面进入正规话题。
沁溪源
2020/09/02
5190
Spring事务详解
最近在项目组的业务技术分析会上,有同事遇到事务的失效的场景导致线上业务不可用。如果对Spring事务的@Transactional理解有限的话,确实很容易在开发中忽视一些细节问题,导致业务不可用的Bug。既然发生了问题,那么必然是要总结和反省的,然后我今天这里有时间总结一下各种事务失效的问题。
麋鹿大哥
2020/11/09
9530
Spring事务管理 - `@Transactional`注解解析
在复杂的应用程序中,数据库事务的管理是确保数据完整性和一致性的重要方面。Spring框架通过@Transactional注解提供了一种便捷的方式来管理事务。本文将深入解析@Transactional注解的原理和用法,并结合实际项目场景,探讨在事务管理中的最佳实践。
王也518
2023/12/20
8740
拜托,不要在问我@Transactional注解了
ps:先明确一点,要使用事务,首先你的数据库肯定得支持事务,你说你数据库都不支持事务,那就算神仙来了也没用的好吧。
敲得码黛
2021/02/22
7190
拜托,不要在问我@Transactional注解了
spring事务为什么不生效,回滚失效,事务try catch
Spring事务的本质其实就是数据库Innodb对事务的支持,没有innodb是事务支持,spring是无法提供事务支持的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。
HaC
2020/12/30
3.3K0
Spring @Transactional事务管理
事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。
鱼找水需要时间
2023/02/16
4790
面试专题:深入事务的传播行为,绕晕面试官
关于事务,大家都知道怎么用吧,当我们需要在使用事务的方面加注解@Transation即可,但是,其实关于事务还有很多属性可以配置,比如事务传播信息,配置参数:propagation,可以指定事务的传播行为。所以本文将主要介绍了Spring中事务传播行为的概念、作用以及Spring支持的7种事务传播行为。通过了解这些事务传播行为,开发者可以更好地掌握Spring事务管理的核心原理,并在实际开发中合理地使用事务传播行为来保证事务的正确性和一致性。并且将详细介绍两种常用传播行为REQUIRED和REQUIRES_NEW的不同。
小明爱吃火锅
2023/12/21
4371
springboot事务-失效的情况
这里首先可以看到saveParentMethod方法是没有事务的;而saveChildStockInfo却是有事务的。当测试类调用
阿珍
2025/02/27
681
springboot事务-失效的情况
Spring声明式与编程式事务的区别,事务与非事务方法相互调用导致的事务不生效问题
序号 参数 含义 1 原子性(Atomicity) 事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么全部不执行。 2 一致性(Consistemcy) 事务前后,数据库的状态都满足所有的完整性约束。 3 隔离性(Isolation) 并发执行的事务是隔离的,一个不影响一个。通过设置数据库的隔离级别,可以达到不同的隔离效果 4 持久性(Durability) 在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
chenchenchen
2022/03/09
1.5K0
Spring声明式与编程式事务的区别,事务与非事务方法相互调用导致的事务不生效问题
面试必问|哪些场景下Spring的事务会失效?
在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。
冰河
2021/12/20
3000
面试必问|哪些场景下Spring的事务会失效?
啪!啪!@Transactional 注解的12种失效场景,这坑我踩个遍
在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到spring事务。
程序员小富
2021/09/24
4.1K1
啪!啪!@Transactional 注解的12种失效场景,这坑我踩个遍
在 Spring 中使用 @Transactional 注解遇到嵌套事务时,事务失效问题的常见原因和解决方法大全
大家好,欢迎来到《猫头虎技术团队》的技术分享!今天我们来聊聊 Spring 中使用 @Transactional 注解时的嵌套事务问题。在实际开发中,嵌套事务常常会遇到一些棘手的问题,尤其是当事务失效时,可能会让你抓耳挠腮,头大如斗。不过别担心,猫头虎团队已经整理了常见的原因以及解决方法,带你一步步走出这些坑。
猫头虎
2025/06/01
1410
在 Spring 中使用 @Transactional 注解遇到嵌套事务时,事务失效问题的常见原因和解决方法大全
@Transactional千万不要这样用!!踩坑了你都可能发现不了!!!
前阵子接手了一段同事之前的代码,里面用到了@Transactional注解,了解Spring的小伙伴肯定知道,@Transactional是Spring提供的一种控制事务管理的快捷手段。但是我这段程序在运行的时候,经常出现莫名其妙的问题,连夜研究了好久才搞清楚,在这里记录一下, 避免大家入坑。
码老思
2023/10/19
9200
@Transactional千万不要这样用!!踩坑了你都可能发现不了!!!
聊聊Spring事务控制策略以及@Transactional失效问题避坑
在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。比如,需要对SQL执行过程进行事务的控制与处理的时候,其整体的处理流程会是如下的示意:
是Vzn呀
2022/08/26
5820
推荐阅读
相关推荐
阿里四面:你能让Spring@Transactional注解在事务下不生效吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档