关于手动提交和回滚的问题

关于手动提交和回滚的问题

user = WeiboUser.objects.get(pk=1)
try:
    transaction.set_autocommit(False)
    weibo = Weibo.objects.create(user=user, content='手动事务hand3')
    comment = Comment.objects.create(user=None, weibo=weibo, content='微博评论hand3')
    transaction.commit()
except:
    transaction.rollback()

如果这么写的话,不加try...except...rollback()是不是也可以

因为经我实验,不加的话,数据库中的效果也是一样的。程序首先关闭了自动提交,所以当程序运行到commit()之前,是不会提交的,当程序运行到第5行出错时,还没有提交,数据库中上一条的改动也被删除了。

而且就最终结果来看,能不能达到效果取决于是否有transaction.set_autocommit(False),transaction.commit()这两条语句:

1、如果没关闭自动提交,就算下面设置了rollback()也没有用,还是会让数据库新增第一条数据,第二条数据没成功新增。

2、如果关闭了自动提交,下面没有commit()手动提交,就算两条新增语句都执行了,在数据库中也会新增之后再回滚掉两条记录,和rollback()也没有关系。

所以,在没关闭自动提交前,程序是执行一条提交一次,关闭之后,在遇到commit()之前,不会提交,如果一直没遇到commit(),数据库中的改动就回滚删除。

这样子看来加不加rollback这句效果都一样,那么加rollback()的关键意义在哪里?


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

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

1回答
好帮手慕笑蓉 2020-05-07 14:09:36

同学,你好。同学提出transaction.rollback()在事物回滚中不起作用,是因为事物回滚在数据库层面起的作用,对于数据库,如果一个事物提交不成功,则会触发回滚,所以出现同学所说的现象。

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


问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
3.从网页搭建入门Python Web
  • 参与学习           人
  • 提交作业       218    份
  • 解答问题       3562    个

本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。

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

在线咨询

领取优惠

免费试听

领取大纲

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