【问题标题】:Django: possible to rollback .save() call?Django:可以回滚 .save() 调用吗?
【发布时间】:2014-01-17 00:38:58
【问题描述】:

来自官方 Django 文档: https://docs.djangoproject.com/en/1.5/topics/db/transactions/#transaction-rollback

a.save() # Succeeds, but may be undone by transaction rollback
try:
    b.save() # Could throw exception
except IntegrityError:
    transaction.rollback()
c.save() # Succeeds, but a.save() may have been undone

调用 transaction.rollback() 会回滚整个事务。任何未提交的数据库操作都将丢失。在此示例中,a.save() 所做的更改将丢失,即使该操作本身没有引发错误。

不保存提交吗?那么回滚应该不会影响还是我错了?

(.save()函数可以设置参数commit=False,表示通常save会提交)

【问题讨论】:

  • Djangodocs.djangoproject.com/en/dev/topics/db/transactions/…。 (PS:您提到的文档还列出了设置保存点和仅在一定程度上回滚的方法,但您可能读过)
  • save()方法的commit关键字参数指的是对象是否保存到数据库。不影响事务是否提交。

标签: python django transactions rollback


【解决方案1】:

您混淆了“提交”一词的两种含义。

在模型或表单上调用 save 确实会导致数据库更新,因此从这个意义上说,它会提交给数据库。但是,所有数据库操作都发生在一个事务中:这些事务可以作为一个块提交或回滚。所以文档是正确的:即使你调用save(commit=True),它仍然是可以回滚的整体事务的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2011-02-06
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多