声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚

首先要添加@EnableTransactionManagement注解开始扫描事物

@SpringBootApplication
@ServletComponentScan
@EnableTransactionManagement
@MapperScan(basePackages = "com.itheima.reggie.mapper")
public class ReggieApplication {public static void main(String[] args) {SpringApplication.run(ReggieApplication.class, args);}
}
    @Override@Transactionalpublic void saveWithFlavor(DishDto dishDto) {//保存菜品的基本信息到菜品表dishthis.save(dishDto);//菜品id:两表的关联idLong dishId = dishDto.getId();//菜品口味List<DishFlavor> flavors = dishDto.getFlavors();flavors = flavors.stream().map((item) -> {item.setDishId(dishId);return item;}).collect(Collectors.toList()); //将map类型再转换为List类型//保存菜品口味数据到菜品口味表dish_flavordishFlavorService.saveBatch(flavors);}
  • 在启动类上添加@EnableTransactionManagement注解。
  • 用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
  • 在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
  • 在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。

注解失效说明:

正常情况下,只要在方法上添加@Transactional注解就完事了,但是需要注意的是,虽然使用简单,但是如果不合理地使用注解,还是会存在注解失效的问题。

@Transactional 应用在非 public 修饰的方法上

事务拦截器在目标方法执行前后进行拦截,内部会调用方法来获取Transactional 注解的事务配置信息,调用前会检查目标方法的修饰符是否为 public,不是 public则不会获取@Transactional 的属性配置信息。

@Transactional 注解属性 rollbackFor 设置错误

rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定rollbackFor属性。

同一个类中方法调用,导致@Transactional失效

开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。
那为啥会出现这种情况?其实这还是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。

异常被你的 catch“吃了”导致@Transactional失效

如果你手动的catch捕获这个异常并进行处理,事务管理器会认为当前事务应该正常commit,就会导致注解失效,如果非要捕获且不失效,就必须在代码块内throw new Exception抛出异常。

数据库引擎不支持事务

开启事务的前提就是需要数据库的支持,我们一般使用的Mysql引擎时支持事务的,所以一般不会出现这种问题。

开启多线程任务时,事务管理会受到影响

因为线程不属于spring托管,故线程不能够默认使用spring的事务,也不能获取spring注入的bean在被spring声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。
如下代码,线程内调用insert方法,spring不会把insert方法加入事务就算在insert方法上加入@Transactional注解,也不起作用。

@Transactional注解说明相关推荐

  1. @Transactional注解最容易忽视的三个失效场景!

    @Transactional注解在以下场景中使用,是会失效的,切记! 1.非public方法 spring对注解事务的方法进行校验,修饰符是不是public,不是 public则不会获取@Transa ...

  2. @aspect注解类不生效_springboot:@Transactional注解 VS @Service注解

    1. Transactional注解与Service/Component注解冲突? 之前遇到一个神奇的事情--用Transactional注解的方法,数据处理了一半,后面的数据处理抛出异常后,没有回滚 ...

  3. 一口气说出 6 种 @Transactional 注解的失效场景

    一.事务 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚等操作,代码侵入性比较强, ...

  4. spring@Transactional注解事务不回滚不起作用无效的问题处理

    这几天在项目里面发现我使用@Transactional注解事务之后,抛了异常居然不回滚.后来终于找到了原因. 如果你也出现了这种情况,可以从下面开始排查. 一.特性 先来了解一下@Transactio ...

  5. @Transactional注解在什么情况下失效?

    引言 1.@Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功.要么同时失败. 2.使用@Transactional注解时需要注意许 ...

  6. 为什么加了@Transactional注解,事务没有回滚?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 在前天的<事务管理入门>一文发布之后,有读者 ...

  7. java事务不生效场景_springboot中使用@Transactional注解事物不生效的坑

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

  8. spring的@Transactional注解详细用法

    概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性. Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型 ...

  9. @getmapping注解的作用_一口气说出6种,@Transactional注解的失效场景

    作者:程序员内点事 引言 昨天公众号粉丝咨询了一个问题,说自己之前面试被问@Transactional注解哪些场景下会失效,一时语塞致使面试失败.所以今天简单的和大家分享一下@Transactiona ...

  10. spring事物配置,声明式事务管理和基于@Transactional注解的使用

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

最新文章

  1. vue插槽样式_vue 插槽简介及使用示例
  2. 清华大学计算机学院主页,计算机图形学基础课程主页 | 清华大学计算机系
  3. linux格式化ext4分区工具,linux学习笔记-磁盘分区、格式化与挂载
  4. Object C数据类型
  5. 1024程序员节:心疼被段子手黑得最惨的你们
  6. 跨境商家为什么要建自己的独立站?
  7. 人脸对齐(二十一)--A Recurrent Encoder-Decoder Network for Sequential Face Alignment
  8. 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元
  9. 来面试,偷懒不答题,直接忽略
  10. MTRR内存类型范围寄存器
  11. 计算机组成原理学习笔记——数据通路
  12. Java8新特性-Lambda表达式
  13. mysql嵌套查询是从外向内执行的吗_MySQL嵌套查询
  14. UltraEdit如何激活
  15. Python数值分析案例01--------四阶龙格库塔法解抛体运动
  16. 输入汉语星期几输出英文c语言程序,c输入1234567,输出英语星期日期
  17. 学mysql后的收获_数据库课程学习的收获和心得体会
  18. 生鲜配送系统源码开发流程教程
  19. 连续复利 continuous compounding
  20. hive常用函数之七字符串函数

热门文章

  1. Android中实现截图的几种方式
  2. 学习笔记 51单片机通用软件延时方法
  3. 图像处理--边缘检测
  4. 括号匹配问题(栈应用)C++
  5. 笔记:百度地图 通过输入地名搜索位置 显示在地图上
  6. 【python】模拟淘宝的客服自动回复系统-socket,json,time模块的应用
  7. 我们的新书--《我是一只IT小小鸟》
  8. 麻雀优化算法 优化XGBoost的参数 python代码
  9. 第7章:OFDM 信道估计与均衡(1)
  10. IntelliJ IDEA/Android Studio 翻译插件,可中英互译。