Spring注解@Transactional是什么?具体的使用方法

4 篇文章 0 订阅

本篇文章,我将和大家介绍 Spring 中的一个注解 @Transactional,将介绍一下 @Transactional的基本概念以及具体的使用方法。希望本篇文章能够对对大家的学习有所帮助!

一、Transactional


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

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

二、实战

1、首先我在Mysql中准备了一条数据

在这里插入图片描述

2、开始测试@Transactional默认能回滚的异常

1、我们的目的是需要把name修改为傻逼2

在这里插入图片描述

2、我们先来测试一下@Transactional 代码如下 大家都知道2/0必会抛出异常

在这里插入图片描述

3、执行测试 如图说明更新成功 别着急咱们继续断点往下面走

在这里插入图片描述

4、果然不出所料 执行到第21行的时候报错了 出现了java.lang.ArithmeticException: /by zero在这里插入图片描述

5、细心的同学会发现ArithmeticException这个异常类是继承了RuntimeException

-在这里插入图片描述

6、这个时候我们去看一下数据库的值到底有没有修改成功 很显然数据是被回滚了 并没有修改成傻逼2

在这里插入图片描述

7、当我直接抛出RuntimeException异常时,数据库数据也是被回滚了 并没有修改成傻逼2

在这里插入图片描述

7、结论@Transactional默认回滚RuntimeException和RuntimeException下面的子类抛出的异常

3、开始测试@Transactional默认不能回滚的异常

1、代码如下

在这里插入图片描述

2、ok直接 抛出的异常是我们指定的java.lang.Exception异常 我们去看看数据库

在这里插入图片描述

3、数据库被更新成傻逼2了 说明@Transactional并不能回滚Exception异常

在这里插入图片描述

三、总结

总结一下:@Transactional默认只能回滚RuntimeException和RuntimeException下面的子类抛出的异常 不能回滚Exception异常如果需要支持回滚Exception异常请用@Transactional(rollbackFor = Exception.class)

补充一下@Transactional一些失效的场景

  • 1、不是用public修饰

  • 2、try catch捕获了异常(没有在catch里面手动抛出异常)

  • 3、没有加@Service(也就是没有被 Spring 管理)

  • 4、数据库引擎不支持事务

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

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

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值