为什么要用Runtime Exception而不是spring的事务管理来保持原子性呢

为什么要用Runtime Exception而不是spring的事务管理来保持原子性呢

正在回答

登陆购买课程后可参与讨论,去登陆

5回答

同学你好。同学说的是在讲事务注解的时候那个测试吗?其实引起事务回滚的BadSqlGrammarException还是继承自RuntimeException的,它本质上还是一个运行时异常呢~

http://img1.sycdn.imooc.com//climg/5dca514e09b6c04e13740822.jpg

http://img1.sycdn.imooc.com//climg/5dca527e0915a7f707470581.jpg

如果解答了同学的疑问,望采纳~

祝学习愉快~

  • 慕UI5285863 提问者 #1
    就是springmvc和实战办公系统那些项目,都是这样吗
    2019-11-12 14:43:24
  • 芝芝兰兰 回复 提问者 慕UI5285863 #2
    是的。祝学习愉快~
    2019-11-12 15:11:01
芝芝兰兰 2019-11-12 11:34:26

同学你好。首先抱歉老师误会了同学的意思,导致没有解决同学的疑问。是的,默认情况下只有RuntimeException才能回滚事务,即使是spring在管理事务。

下面来重新解释下:

1、Exception是异常,他又分为运行时异常RuntimeException和非运行时异常(检查异常),其中这个检查异常是代码中必须处理,否则编译无法通过的异常。

图来自第一阶段 Java异常 2-2节 异常分类:

http://img1.sycdn.imooc.com//climg/5dca151809bb6c6a13010656.jpg


2、Spring进行事务管理时,默认地使用@Transactional 只在抛出运行时RuntimeException 时才标识事务回滚。当直接抛出Exception时,由于不能确定是否是运行时异常,所以无法直接标识回滚。

逻辑上,也是使用RuntimeException更为合理,运行时异常就是代码逻辑问题导致代码不能继续运行下去的异常。运行异常是用来标识一种调用方本身无法处理或恢复的程序错误。

如果想要抛出Exception也会回滚,需要使用@Transactional(rollbackFor = Exception.class)。


如果解答了同学的疑问,望采纳~

  • 提问者 慕UI5285863 #1
    谢谢老师的回答,那么之前的spring项目为什么可以不用写明RuntimeException也能进行事务回滚呢,是不是和当前这个项目有什么区别呢
    2019-11-12 11:37:36
提问者 慕UI5285863 2019-11-11 20:23:06

http://img1.sycdn.imooc.com//climg/5dc95290092e335325481284.jpg试错视频在该处

提问者 慕UI5285863 2019-11-11 20:22:11

老师,这个老师在视频里有演示过,试错过,老师在视频里把ShopOperationException继承自RuntimeException改为继承自Exception 然后再执行事务就没有回滚了,那么是不是说只有RuntimeException才能回滚事务呢 即使是spring在管理事务?

芝芝兰兰 2019-11-11 18:52:38

同学你好。不是使用的RuntimeException来保持的原子性,还是使用声明式事务的注解来达到的:

http://img1.sycdn.imooc.com//climg/5dc93a4009e3478304230142.jpg

添加这个注解后,会将这个方法作为一个事务来看待,要么全部执行,要么全部不执行。那么拿什么作为判断是否成功执行的依据呢?就是是否抛出异常。只要这个方法中抛出了异常,这个事务就会被回滚。

而我们自己定义RuntimeException的意义,在为了记录一些逻辑上的“不合理”,并且触发事务回滚,使这些不合理的数据更改不会应用于数据库。

如果解答了同学的疑问,望采纳~

祝学习愉快~

  • 提问者 慕UI5285863 #1
    也就是说,如果没有Runtime Exception 只要抛出异常 也可以回滚吗 可是Exception抛出了异常没有回滚 只有RuntimeException抛出了才回滚了
    2019-11-11 18:54:56
  • 芝芝兰兰 回复 提问者 慕UI5285863 #2
    同学你好。同学的异常造成程序终止执行了吗?可以将同学的代码发过来我们看一下呢~
    2019-11-11 20:10:19
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师