Young's blog Young's blog
首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Young

首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 手把手教你玩转 SpringBoot 日志比较
  • Springboot [日志管理LogBack]
  • 【Spring】事务失效的场景
    • 1.数据库引擎不支持事务
    • 2.事务方法未被 Spring 容器管理
    • 3.方法没有被 public 修饰
    • 4.同一类中方法之间直接的调用
    • 5.未配置事务管理器
    • 6.事务传播类型不支持事务
    • 7.进行异常捕捉却没有抛出
    • 8.错误的标注异常类型
    • 9.开启多线程
  • excel百万数据如何导入导出
  • 如何介绍自己的项目经验?
  • 多线程事务回滚的处理
  • idea 热部署插件 JRebel 安装及破解,不生效问题解决
  • SpringBoot 监控神器——Actuator 保姆级教程
  • 什么是多租户架构?
  • 小心 MybatisPlus 的一个坑与面试题 Transaction rolled back because it has been marked as rollback-only
  • SpringBoot 插件化开发模式详细总结
  • CAS 单点登录概念
  • SpringBoot读配置的6种方式
  • 阿里二面:使用 Nacos 做注册中心怎么做优雅发布?
  • 分布式系统的补偿机制!
  • 复杂业务系统的架构思路!
  • 解读 RocketMQ 5.0 全新的高可用设计
  • Spring事务详解
  • 一文总结 MetaQ/RocketMQ 原理
  • Spring boot
andanyang
2023-06-07
目录

【Spring】事务失效的场景

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

Spring 事务生效的前提是所连接的数据库要支持事务,如果底层的数据库引擎都不支持事务,则 Spring 的事务肯定会失效。

例如: MySQL 用的不是 InnoDB 引擎,而是用的 MyISAM 存储引擎。

# 2.事务方法未被 Spring 容器管理

如果事务方法所在的类没有加载到 Spring IOC 容器中,也就是说,事务方法所在的类没有被 Spring 容器管理,则 Spring 事务会失效。

例如:你的方法所在类没有加@Component 或者@Service 注解。

# 3.方法没有被 public 修饰

如果事务所在的方法没有被 public 修饰,此时 Spring 的事务也会失效。

# 4.同一类中方法之间直接的调用

例如:如果同一个类中有两个方法分别为 A 和 B,方法 A 没有添加事务注解,而方法 B 添加了 @Transactional 事务注解,此时方法 A 直接调用方法 B,则方法 B 的事务会失效。

因为声明式事务管理(@Transactional)是建立在 AOP 动态代理之上的。其本质是对方法执行前后进行拦截,然后在目标方法开始执行之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。同一类内方法之间的直接调用是不走代理的,这样就无法进行功能的增强处理,所以事务不起作用。

# 5.未配置事务管理器

如果在项目中没有配置 Spring 的事务管理器,即使使用了 Spring 的事务管理功能,Spring 的事务也不会生效。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
1
2
3
4
5

例如:对于 SpringBoot 项目来说,导入了 mybatis 的 starter 依赖后,SpringBoot 会自动注入 DataSourceTransactionManager 事务管理器,这样我们就可以直接用 @Transactional 注解使用事务了。

# 6.事务传播类型不支持事务

如果方法的事务传播类型为不支持事务的传播类型,则该方法的事务在 Spring 中会失效。

例如: A 方法的事务传播类型为 NOT_SUPPORTED,不支持事务,此时用带事务的方法 B 去调用 A 方法,则 A 方法的事务失效。

# 7.进行异常捕捉却没有抛出

比如对某一个新增数据代码段进行 try catch 异常,而 catch 里没有向外抛出异常,此时 spring 事务无法回滚。

# 8.错误的标注异常类型

如果在 @Transactional 注解中标注的异常类型不是我们抛出的异常类型,则 Spring 事务的回滚会失效。

例如: Spring 中默认回滚的异常类型为 RuntimeException,如果此时你抛出的异常是 Exception,那么 Spring 事务中无法捕获到 Exception 异常,则事务回滚会失效。

# 9.开启多线程

开启一个线程去执行数据库操作,多线程内的方法将不被 spring 事务控制。

例如:一个带事务的方法 A 中开启线程去执行同类中的一个 insert 方法,即使这个操作失败了,也不会回滚 A 中的其他数据库操作。

注意:如果把 insert 方法提出到一个新的类中,加入事务注解,就能成功的把 insert 方法加入到 spring 事务管理中。但是使用多线程事务的情况下,如果想进行回滚,比较麻烦,因为我们感知不到线程中方法执行的异常。

编辑 (opens new window)
#面试
上次更新: 2024/04/19, 08:52:45
Springboot [日志管理LogBack]
excel百万数据如何导入导出

← Springboot [日志管理LogBack] excel百万数据如何导入导出→

最近更新
01
idea 热部署插件 JRebel 安装及破解,不生效问题解决
04-10
02
spark中代码的执行位置(Driver or Executer)
12-12
03
大数据技术之 SparkStreaming
12-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Young | MIT License
浙ICP备20002744号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式