Django:如何根据某些条件回滚对数据库所做的更改?

时间:2014-05-24 07:33:00

标签: django django-models webserver

我必须根据某些条件回滚对数据库所做的更改,但直到那个“某些条件”,更改应该在数据库中反映给其他用户。

@transaction.atomic
def populate_db(input):
  Object = Table.objects.select_for_update().get(attributeX=input)
  Object.attributeY = False
  Object.save()

  ** some operation here **

我面临的问题是,在整个函数执行成功之前,attributeY的值没有存储在数据库中,但我想要的是属性的更改值应该反映在数据库中,直到某些操作< / strong>失败。

而且我无法知道某些操作是否失败,因为我在这里尝试处理的失败是意外关闭浏览器,停电等事情。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

那么populate_db会看到什么表明交易没有完成?

例如,座位已预留但尚未支付(因故障)。在这种情况下,populate_db在具有付款授权码之前不应完成交易。

或者,如果您想将座位的状态标记为being_reserved,则没有交易,状态设置为being_reserved,其他客户端可以看到它。在此模型中,populate_db将负责检测故障(可能通过例外)并在另一个数据库更新中将座位状态返回到available

您的想法中的错误是无论任何组件发生故障,数据库都可以保持一致。这个要求无法满足。您不能同时允许其他客户看到being_reserved并遭遇populate_db失败。

这种权衡是每个预订系统的核心。面对在此列举的任意失败,有太多方法可以重新获得一致性。