我必须根据某些条件回滚对数据库所做的更改,但直到那个“某些条件”,更改应该在数据库中反映给其他用户。
@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>失败。
而且我无法知道某些操作是否失败,因为我在这里尝试处理的失败是意外关闭浏览器,停电等事情。
感谢任何帮助,谢谢!
答案 0 :(得分:1)
那么populate_db
会看到什么表明交易没有完成?
例如,座位已预留但尚未支付(因故障)。在这种情况下,populate_db
在具有付款授权码之前不应完成交易。
或者,如果您想将座位的状态标记为being_reserved
,则没有交易,状态设置为being_reserved
,其他客户端可以看到它。在此模型中,populate_db
将负责检测故障(可能通过例外)并在另一个数据库更新中将座位状态返回到available
。
您的想法中的错误是无论任何组件发生故障,数据库都可以保持一致。这个要求无法满足。您不能同时允许其他客户看到being_reserved
并遭遇populate_db
失败。
这种权衡是每个预订系统的核心。面对在此列举的任意失败,有太多方法可以重新获得一致性。