本篇文章,我将和大家介绍 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属性。