慕酷酷来教下我

慕酷酷来教下我

在测试事务回滚时,跟视频老师一样,在商品cid置空和删除分类之间,加了一个算术异常。可是此时我把事务回滚注释掉,方法执行后,商品cid并没有被置空,分类也没被删除(这是应该的),求解?

正在回答

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

2回答

同学你好,

这里确实是没有展示出来,

但是写不写回滚还是有区别的在同一事务条件下,回滚和不提交,表现是一样的,但是还有些差别


事务处理,是将操作事件交给数据库(模拟)运行,直到commit操作,才使得修改实际产生效果,你可以看做是未提交事务都是处于一个临时库中进行
回滚是对于同一个事务,如果产生了错误,那么取消这个临时库中的操作,不对实际数据产生影响

最主要的区别在于,如果不回滚,这些临时操作会持续到这个个connection结束为止,也就是虽然你看不到,但是临时库的操作依然存在,而回滚是即时生效,其实都是回滚了,只是时间点的不一样

如果这个connection持续的时间长,就会锁着这个表,则会造成其他的问题。所以我们还是需要进行回滚的。

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

  • qq_粽翎_0 提问者 #1
    就你的回答提出点疑问。事务的提交一般不是放在最后嘛,上面操作数据库时,中途出现异常了,(有捕获异常)下面的代码是不是不会执行了,持续的时间就这么多。在catch块里加了事务回滚,代码执行到上面的异常,捕获到了,事务回滚。这个持续的时间跟之前的持续时间不是一样的吗?哪里来的时间长时间短的?
    2019-12-23 12:20:33
  • 好帮手慕阿莹 回复 提问者 qq_粽翎_0 #2
    同学你好,如果发生异常,如果写了回滚,则执行到异常就进入到catch中回滚了,则回滚后该connection就断开(或者被回收)了,如果不写回滚,则执行到异常了,并不会断开(回收)connection,而且由于遇到了异常,也没办法执行到提交,则相当于这个connection就放在那儿了,既没有回滚,也没提交了。虽然底层会做了处理,但这样终究是不好的。所以,还是需要写回滚代码的。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-12-23 14:50:38
  • qq_粽翎_0 提问者 回复 好帮手慕阿莹 #3
    好的理解,感谢老师解答
    2019-12-23 15:42:01
芝芝兰兰 2019-12-22 18:54:27

同学你好。同学将事务回滚注释掉的同时,是否注释了红框中的两句呢?如果没有,那么产生同学描述的现象,很有可能并没有进行提交呢~

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

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

祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    都没有注释掉哦。其他代码都不动的,就只是将回滚那段try catch注释了而已
    2019-12-22 18:58:02
  • 芝芝兰兰 回复 提问者 qq_粽翎_0 #2
    同学你好。那么就是Connection并没有进行提交,代码在执行到conn.commit之前,就已经抛出了异常,所以都没有执行成功呢~同学可以将红框中的部分注释掉,试一下。祝学习愉快~
    2019-12-22 19:15:56
  • 提问者 qq_粽翎_0 回复 芝芝兰兰 #3
    哦哦哦了解了谢谢老师,被视频老师的思维带过去了。这样说的话视频老师举的例子就有问题了,并不能测试到回滚事务,中途出现异常导致事务不能提交
    2019-12-22 19:40:37
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星

相似问题

登录后可查看更多问答,登录/注册

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

在线咨询

领取优惠

免费试听

领取大纲

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