关于提交和回滚

关于提交和回滚

比如说Navicat是客户端,在Navicat中写了一个插入的SQL语句,然后选择执行,然后得到插入成功的影响了1条数据的信息。这里怎么体现了提交commit呢?

又比如写了一条连续插入三条信息的语句,结果其中有一条语句写错了数据类型,报错会回滚,这里有在哪里体现了回滚呢?

以及为什么需要设置手动提交而不是自动提交?

那些场景会需要手动提交?哪些需要自动提交?

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

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

3回答
好帮手慕小脸 2020-08-26 17:14:37

同学你好,undo日志用于存放数据被修改前的值,如果一个事务做回滚或某种原因执行失败了,需要根据undo日志中记录的原数据做数据恢复。所以打开项目执行操作时会记录id号。即一直增长id号。

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


好帮手慕小脸 2020-08-26 10:29:21

同学你好,

1、这里在回滚之前判断是否为null,是为了避免在获取session的时候发生异常,这样session并没有获取到,直接回滚会报空指针异常。

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

所以在catch中需要先判断一下session是否为空。

2、由于id是自增长的,以同学的描述来讲提没提交,表都会记录。只是未提交的数据会存放在undo日志中,所以去掉注释后再次运行会接着上一次打印的id号而不是表中的id号

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


  • 提问者 mixiaofan #1
    undo日志是什么,它好像会一直存在,因为重新打开项目之类的依旧会一直增长id号。有什么办法可以避免这种状况吗?
    2020-08-26 13:05:21
好帮手慕小脸 2020-08-25 14:55:57

同学你好,

1、在Navicat中写了一个插入的SQL语句,然后选择执行,然后得到插入成功的影响了1条数据的信息。这里怎么体现了提交commit呢?

答:commit的作用是将数据更改提交给数据库。当编写完sql后,然后执行sql到数据库中可称之为提交

2、又比如写了一条连续插入三条信息的语句,结果其中有一条语句写错了数据类型,报错会回滚,这里有在哪里体现了回滚呢?

答:当添加数据错误时,新增的数据会回滚到之前没有新增时的状态

3、手动提交事务的好处: 当业务逻辑复杂时,可以根据具体需要来提交事务。

比如: 银行转账的业务,在A行取款和在B行存款相当于对两张表分别进行update操作。但一旦中间产生错误,需要这两个操作都回滚。这种情况下这两个sql需要绑定为一个事务。此时,不是在A取款后提交事务,而是在B存款也执行后,提交事务。

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


  • 提问者 mixiaofan #1
    关于commit,我在插入的测试方法中,把手动提交事务注释掉后测试运行,控制台能够打印自动增长的id号,但是在表中没有实际的数据。去掉注释后再次运行会接着上一次打印的id号而不是表中的id号。这是为什么
    2020-08-25 20:34:14
  • 提问者 mixiaofan #2
    } catch (Exception e) { if (sqlSession != null) { sqlSession.rollback();//如果出错,回滚 } throw e; } finally { 这里,为什么是sqlSession!=null才会回滚,==null不是才是出错了吗
    2020-08-25 20:36:16
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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