我有以下设置:
get_conf()
获取配置。 save()
方法,该方法告知工作人员重新加载配置我注意到有时工人没有正确接收更改的配置。特别是,当conf重新加载时间比平时短时,工作人员从get_conf()
获得“旧”配置(缺少最近的更改)。 Django中使用的事务模型是默认的自动提交。
我提出了以下可能导致此行为的可能情况:
save()
返回,但MySQL / InnoDB仍在处理(自动)提交上述场景中的第2步是否可行?也就是说,如果使用自动提交事务方法,django模型save()
可以在数据实际提交到数据库之前返回吗?或者,为了实现一层,可以在提交完成之前完成MySQL自动提交INSERT
或UPDATE
操作(更新/插入对其他事务可见)?
答案 0 :(得分:0)
对象可能变脏,请在保存后尝试刷新对象。
obj.save()
obj.refresh_from_db()
参考:https://docs.djangoproject.com/en/1.8/ref/models/instances/#refreshing-objects-from-database
答案 1 :(得分:0)
这绝对看起来像是竞争条件。
如果只有一个脚本和一个数据库,那么您所描述的场景永远不会发生。 save()时,方法不会返回,直到数据实际提交到数据库。
如果您使用主/从配置,则可能是复制延迟的受害者:如果您在主服务器上写入但在从服务器上读取,那么您的脚本完全可能没有&#39 ;等待足够长的时间进行复制,并且在它有机会复制主服务器之前,你从slave中读取旧的conf。
可以使用数据库路由器在django中设置这样的配置,也可以使用DB代理在DB端完成。检查一下。