hello,慕仔们,我们又见面了。前段时间小慕做的智慧社区门禁服务的业务中恰好遇上了事务失效的场景,于是就有了今天的这篇文档总结,避免让慕仔们踩坑。

今天我们不聊微服务架构下的分布式事务,只谈单体应用系统下的事务,那到底哪些情况下会导致事务失效呢?咱们现在就来唠嗑唠嗑吧!

1. 底层数据库引擎不支持事务

以MySQL为例,MyISAM引擎不支持事务操作,InnoDB引擎支持事务,MySQL从5.5.5开始默认的引擎是InnoDB,之前的版本默认的都是MyISAM,所以这个要注意。

2. 被@Transactional 注解修饰的方法为非public类型

如果被@Transactional注解修饰的方法,修饰符非public或者被final修饰,则事务会失效,因为AOP没办法为这样的方法生成一个代理,自然事务就无法生效。这个在Spring的官方文档里面也有说明。

3. 异常被吃掉了

如果异常被 catch 住,那事务也是会失效呢,伪代码如下

@Transactionalpublic void test(){  try{    //插入一条数据    insertData();    //更改一条数据    updateData();  }catch(Exception e){    log.error("异常被捕获,事务失效",e);  }}

4. 异常抛出类型错误

@Transactional 注解有个属性:rollbackFor,这个属性可以设置想要回滚的异常类型,那它默认的异常类型是什么?立即回答:RuntimeException,太棒了。

如果说我们没有设置这个属性,而且抛出的异常比这个大,那么事务就不会回滚,例如:

@Transactionalpublic void test(){  try{    //插入一条数据    insertData();    //更改一条数据    updateData();  }catch(Exception e){    // 这个时候事务就不会回滚,    throw new Exception("操作失败!");  }}

5. 本类方法调用

这一个应该是最容易踩坑的了,也是小慕踩坑的地方,先来看两段伪代码:

代码一:

@Servicepublic class TestServiceImpl implements TestService {   public void testA() {        // 查询数据,并进行一些判断        // 调用本类的另外一个方法        testB();    }   @Transactionalpublic void testB(Test test) {        // update test    }}

小慕提问:testA()方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 testB() 方法,testB() 方法上的事务管用吗?

代码二:

@Servicepublic class TestServiceImpl implements TestService {   @Transactionalpublic void testA() {        // 查询数据,并进行一些判断        // 调用另外一个方法        testB();    }@Transactional(propagation = Propagation.REQUIRES_NEW)public void testB(Test test) {        // update test    }}

小慕提问:在 testA() 方法上加了 @Transactional,testB() 的注解上加了 REQUIRES_NEW 新开启一个事务,那么新开的事务管用么?

立即推,以上两段代码的事务都不生效,答对了吧,答对的小伙伴手动@我,找我领红包,

为啥会失效,因为他们是本类的方法直接调用,这个时候会用this关键字,没有经过 Spring 的代理类去调用此方法,从而没有开启事务管理,默认只有在外部调用事务才会生效。

总结::加事务注解的方法给本类里面的方法调用,事务不生效!

话又说回来了,那怎么解决这个问题呢?小慕提供3种解决方案

解法一::最直白的就是把方法拆出来,放在两个类里面(Spring推荐的一种方式);

解法二:在类里面注入自己,用注入的对象再调用另外一个方法,这个不太优雅;

解法三:在Spring的配置里面增加一段配置  :

   <aop:aspectj-autoproxyexpose-proxy="true"/>

6、没有被spring管理

当这个类只是一个普通类,没有被spring管理成为一个Bean对象,那它很自然的就不能使用spring提供的事务管理了,事务自然就不生效。

半山腰总是最挤的,你得去山顶上瞅瞅,拜拜

好,今天的内容就分享到这里了,你们一定要变优秀哦,我们下期再见。

现在公众号迁移到这个啦, 不要迷路了,慕仔们,加油哦!

接下来的一段时间,我会专注Java技术栈,计算机网络,数据结构和算法,操作系统,设计模式,计算机组成原理,数据库原理,设计模式来做分享,欢迎你们和我一起学习,一起提高,Fighting!

为啥Spring事务失效了,你踩坑了吗?相关推荐

  1. spring事务失效了? @Transactional不管用了 ?看看这些@Transation的坑

    spring事务失效了? @Transactional不管用了 ?看看这些@Transactional的坑 文章目录 spring事务失效了? @Transactional不管用了 ?看看这些@Tra ...

  2. 详细整理Spring事务失效的具体场景及解决方案

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制:好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,溪源此篇文章给大家整理了一下常见Sprin ...

  3. 面试官:Spring事务失效的场景有哪些?如何解决?

     作者:溪~源 blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机 ...

  4. 你否有遇到Spring事务失效,花费太多时间找bug

    作者:溪~源 来源:blog.csdn.net/xuan_lu/article/details/107797505 实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事 ...

  5. Spring事务失效 -方法内部调用

    首先感谢网友的文章 Spring事务失效的2种情况 JDK动态代理给Spring事务埋下的坑 前提知识: 两个前提 1 注解使用 spring容器的事务管理注解 @org.springframewor ...

  6. Spring 事务失效?看这篇文章就够了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...

  7. Spring 事务失效的 8 大场景,看看你都遇到过几个?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/Yang_yangyang/ article/details/114359881 用 Spring 的 @Transaction ...

  8. 8个Spring事务失效的场景,你碰到过几种?

    前言 作为Java开发工程师,相信大家对Spring种事务的使用并不陌生.但是你可能只是停留在基础的使用层面上,在遇到一些比较特殊的场景,事务可能没有生效,直接在生产上暴露了,这可能就会导致比较严重的 ...

  9. 详解spring事务失效和回滚失败的场景

    详解spring事务失效和回滚失败的场景 详解spring事务失效和回滚失败的场景 前言 一 .事务不生效 1.访问权限问题 2. 方法用final修饰 3.方法的内部调用 3.1 新加一个Servi ...

最新文章

  1. 死锁产生条件-请求和保持条件
  2. 中文代码编写php,PHP开发网站代码编写规范
  3. Tensorflow学习笔记(三)
  4. Struts2——(3)ValueStack(值栈)
  5. java 内置注解入门
  6. 【树上分块】【dfs序】2018沈阳网络赛 —— J题
  7. Knockoutjs开发指南
  8. c语言课程设计找出肇事车牌,C语言课程设计参考题目.doc
  9. mac jenkins下载与安装
  10. 拼多多:“优惠券Bug属网络诈骗”;抖音多闪上架 App Store;任正非不知谁是接班人 | 极客头条...
  11. jquery中的mouseover、mouseout 和 mouseenter 、 mouseleave的区别
  12. nvcc编译器之GPU代码编译(chapter 5)
  13. 云服务完整删除mysql
  14. 如何在Total Commander中使用命令行
  15. java 搭建ota服务器_OTA配置服务器
  16. SpringBoot文件上传和下载
  17. 软件设计师考试 设计模式
  18. python QR分解求解线性方程组和矩阵本征值和本征向量
  19. c51单片机学习笔记-LED流水灯实验
  20. 为什么说Python是数据科学领域的最佳语言?

热门文章

  1. [pinyin4j] java版汉字转换拼音(大小写)
  2. scrapy源码学习 - 启动一个crawl命令
  3. Excel表格中第一个输入的零不显示怎么办?
  4. 斯坦福 AI 课程 10 年发展史
  5. webStorm自动格式化
  6. 云服务器环境安装、卸载与配置:mysql
  7. 【224】基本功能计算器
  8. 游戏直播软件测试工程师,【斗鱼TV软件测试工程师面试】斗鱼软件测试面试经验。-看准网...
  9. 雷达信号Matlab处理(一)
  10. 12AU7+6V6GT 耳放的设计