前: 在项目运行时,由于某条数据插入失败,发现事务未起作用

看了下启动类并没有加@EnableTransactionManagement注解开启事务

@EnableScheduling
@SpringBootApplication
@MapperScan(basePackages = "com.huofu.koudai.mapper")
@EnableConfigurationProperties(OssProperties.class)
@EnableTransactionManagement
public class AppApplication {public static void main(String[] args) {SpringApplication.run(AppApplication.class, args);}@Beanpublic OssTemplate ossTemplate(OssProperties properties) {return new OssTemplate(properties);}
}

在添加了注解后发现事务仍然不起作用,查阅资料后发现springboot的自动装配自动开启了事务管理

具体流程如下:

查看启动类的核心注解

找到自动装配注解

进入自动装配注解查看选择器

继续进入选择器,查看选择器所导入的类,找到自动获得的Entity

找到该方法

此方法传入一个元数据

此方法中的loadFactoryNames方法, 就是加载所有的组件的全限类

进入 loadFactoryNames方法,此方法第一个参数为类型,第二个参数为类加载器,返回值为本类的loadSpringFactories方法

查看loadSpringFactories方法

getResources获取自动配置组件
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";

找到public class AutoConfigurationImportSelector类所在的包,查看它的META-INF文件,找到spring.factories文件:

进入此文件我们可以看到,事务的自动装配配置类,当Springboot容器启动的时候,首先会扫描此文件,会自动为我们加载事务相关信息

因此,springboot项目并不需要@EnableTransactionManagement注解开启事务

接下来,继续查找事务不生效的原因:

最终查询到在Spring的Transactional的API文档中,有以下一段说明:

If no rules are relevant to the exception, it will be treated like DefaultTransactionAttribute (rolling back on runtime exceptions)

意思是:如果没有与异常相关的规则,它将被视为默认事务属性(即回滚运行时异常)。

因此需要指定注解属性为@Transactional(rollbackFor = Exception.class),这样,便可回滚所有异常.

总结:

① springboot自动装配会自动开启事务,不需要@EnableTransactionManagement注解开启事务

② spring声明式事务,需要在@Transactional注解添加rollbackFor指定回滚类型,否则默认只回滚运行时异常

关于springboot中的事务注解相关推荐

  1. 难以想象SpringBoot中的条件注解底层居然是这样实现的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  2. 面试:SpringBoot中的条件注解底层是如何实现的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/bm2qqi Spr ...

  3. springboot中的@Conditional注解

    springboot中使用@Configuration注解完成一个配置类的配置,被该注解标注的类会在程序启动时自动的加载到IOC容器,但如果我们想通过一些条件来控制被@Configuraion注解标注 ...

  4. SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证

    作者:超级小豆丁 http://www.mydlq.club/article/49/ 目录 一.为什么使用 @Valid 来验证参数 二.@Valid 注解的作用 三.@Valid 的相关注解 四.使 ...

  5. springboot中使用@Transactional注解事物不生效的原因

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声 ...

  6. SpringBoot 中定时执行注解(@Scheduled、@EnableScheduling)

    项目开发中经常需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息.Spring为我们提供了异步执行任务调度的方式,提供TaskExecutor .TaskScheduler 接口. ...

  7. springboot中mybatisplus基于注解的多对多级联查询

    mybatisplus使用注解多对多级联查询 mybatis提供了注解和xml两种方式配置我们的sql语句,我在接触使用的过程中更喜欢注解的方式,在我的上一个项目中,我全部使用mybatis注解去完成 ...

  8. SpringBoot中通过ConfigurationProperties注解的方式读取application.yml中配置的属性值

    场景 在SpringBoot后台项目中,某些固定的属性需要配置在配置文件application.yml中. 比如上传到服务器的文件路径. 然后在其他业务代码中比如上传文件接口中需要或者到配置的这个属性 ...

  9. SpringBoot中使用@Mapper注解需要哪个包

    场景 在Eclipse中新建springBoot项目后,要使用@Mapper注解. 实现 打开pom.xml 添加 <!-- mybatis整合Springboot --><depe ...

最新文章

  1. matlab最小分类错误全局二值化算法
  2. mysql如何创建简单索引_mysql 如何创建索引呢,这个其实很简单
  3. 有勇气的牛排---微信小程序
  4. 【原创】iframe与父页面之间,变量、方法互相调用
  5. mysql scrapy 重复数据_大数据python(scrapy)爬虫爬取招聘网站数据并存入mysql后分析...
  6. 【ZOJ - 4024】Peak(模拟,水题)
  7. 深度学习(莫烦 神经网络 lecture 3) Keras
  8. oracle和mysql的备份有几种方法_Oracle 数据库的备份与恢復都有哪几种方法?
  9. easyui 扩展tree 获取选中节点的级数
  10. javascript中引号嵌套
  11. mysql binlog hdfs_Mysql binlog 之阿里canal
  12. 多元函数的牛顿迭代法
  13. vue-Vant组件上传图片
  14. I want to do that you feel proud of me.
  15. HttpClient使用详解 get与post请求
  16. 【2022年上半年信息系统管理综合知识】
  17. jenkin swindows启动_windows启动过程
  18. 【工业设计】设计应注意技术、情感需求和技术发展
  19. 文件对比软件 Beyond Compare 4简介
  20. Linux(ubuntu)安装libevent

热门文章

  1. 解决win7打开防火墙时提示 防火墙无法更改某些设置,错误代码0x80074200
  2. 基于springboot学生宿舍管理系统 毕业设计-附源码211955
  3. MATLAB数字信号处理基础
  4. 安全合规--50--基于国内法律法规的企业数据合规体系建设经验总结(八)
  5. 美图大数据平台架构实践
  6. 31 Circle类
  7. Mathorcup数学建模竞赛第四届-【妈妈杯】A题:2048 游戏玩法(附赛题解析及C++代码)
  8. STC51单片机11——EEPROM测试
  9. 唱吧mp3 mp4 免费提取
  10. html5 弹性挂件,第五人格5款带有特殊动作的挂件,动作超有爱,佛系玩家必备...