关于事务处理的问题

关于事务处理的问题

对于业务层的方法除查询的以外,都要封装成事务,而事务并不是对所有异常都回滚操作的(这点我是在后续课程校园商铺看到的),这里为什么不需要使用try-catch块包裹,进而出现任何异常时都要在catch中

throw new  RuntimeExcepetion()确保回滚呢?

正在回答 回答被采纳积分+1

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

4回答
好帮手慕小班 2020-04-08 10:20:54

同学你好,我们可以通过以下方式改变事务的默认处理方式:
在@Transaction注解中可以定义RollbackFor指定某种异常是否回滚。比如:

@Transaction(RollbackFor=Exception.class)

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

好帮手慕小班 2020-04-07 19:31:26

同学你好,1、同学的说法是正确的,一般声明式事务只对运行时异常RuntimeException做回滚的操作。

        2、按照同学的说法,可以参考如下思路来理解一下:

        第2段代码执行中却出现了异常,但不属于RuntimeExcepetion,此时我们可以尝试捕获这个异常,重新抛出一个新的RuntimeException的异常,触发当前方法中的事务,执行回滚。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 慕沐8221787 #1
    可有什么办法设置一下,让所有异常都触发事务回滚?
    2020-04-07 20:52:05
好帮手慕小班 2020-04-07 17:33:30

同学你好,1、如果配置了transationManager,而且做了声明式事务配置,就能确保数据库访问层所有操作异常的回滚,而不必区分异常的类型,对吗?

     事务并不是对所有异常都回滚操作的-->可以这样理解:当出现运行时异常,也就是在执行sql语句的操作的过程中出现问题,就会对当前内容进行回滚。所以这里的异常其实就是运行时异常RuntimeExcepetion,jvm可以捕获到的异常。

    2、如果添加了事务管理的业务方法中,除了数据库访问层面的逻辑外,还有其他的业务逻辑,而且也有可能出现异常,此时如何确保事务的原子性?

       这里同学的理解有一些问题,事务本身就是为了保证数据库数据的一致性而产生的,如果不是操作数据库,发生了异常也对数据库没有什么实质性的影响。

综上所述,事务的触发在配置了事务的方法中,运行时抛出了异常时,触发对应事务,将之前的操作进行回滚。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 慕沐8221787 #1
    两个问题: 第一、按照老师的说法,在执行sql语句的操作过程中出现的异常一定是RuntimeExcepetion;事务管理只针对RuntimeExcepetion回滚,对吗? 第二、如果事务管理的业务方法中,有以下三段代码:1、数据库中某些表的写操作;2、其他业务逻辑;3、数据库中另外一些表的写操作,那么如果出现这样一种情况:第1段代码写入操作正常完成,第2段代码执行中却出现了异常,但不属于RuntimeExcepetion,这种情况如何确保第1段代码回滚呢?
    2020-04-07 18:16:13
好帮手慕小班 2020-04-07 15:27:04

同学你好,1、这里不添加try-catch是因为在biz中配置了事务管理器transationManager,对所有的方法实现了对应的事务管理:

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

        事务触发的机制是在配置了事务的方法中抛出了异常时,将之前的操作进行回滚。比如:一次性需要向数据库中插入10条记录,在执行到第5条时报错了,抛出了异常。如果不配置事务在数据库中会产生4条脏数据,配置了事务抛出异常时会将之前的插入操作进行回滚。这样数据库中就不会产生脏数据了。

        而propagation="REQUIRED" 的意思其实就是新建一个事务,我们要让它必须有事物。

        2、Spring并不直接管理事务,而是提供了多种事务管理器,它们将事务管理的职责委托给持久化机制所提供的平台相关的事务实现。所以在当前项目里,直接配置事务管理器transationManager就可以了实现对应异常的事务管理。这里我们只要会用,而不用关心它的底层是如何实现的。

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 慕沐8221787 #1
    老师的意思是,如果配置了transationManager,而且做了声明式事务配置,就能确保数据库访问层所有操作异常的回滚,而不必区分异常的类型,对吗? 第二个问题是,如果添加了事务管理的业务方法中,除了数据库访问层面的逻辑外,还有其他的业务逻辑,而且也有可能出现异常,此时如何确保事务的原子性呢?
    2020-04-07 16:15:04
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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