首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自动提交事务的Django save()行为

问使用自动提交事务的Django save()行为
EN

Stack Overflow用户
提问于 2015-05-13 13:06:48
回答 2查看 2K关注 0票数 8

我有以下设置:

  • 一些数据处理工作者通过http从django视图get_conf()获得配置。
  • 配置存储在django模型中,使用MySQL / InnoDB后端
  • 配置模型重写了save()方法,该方法告诉工作人员重新加载配置。

我注意到,有时工作人员没有正确地接收更改的配置。特别是,当conf重新加载的时间比通常短时,工作人员从get_conf()获得了“旧”配置(丢失了最近的更改)。Django中使用的事务模型是默认的自动提交。

我想出了以下可能导致这种行为的可能方案:

  1. 保存新配置
  2. save()返回,但MySQL / InnoDB仍在处理(自动)提交
  3. 启动工作人员,并为新配置发出http请求。
  4. MySQL (自动)提交完成

上述场景中的步骤2可行吗?也就是说,如果使用自动提交事务方法,django模型save()能否在DB中实际提交数据之前返回?或者,要往下走一层,MySQL自动提交INSERT或UPDATE操作是否可以在提交完成之前完成(其他事务可以看到更新/插入)?

EN

回答 2

Stack Overflow用户

发布于 2015-06-16 06:33:39

对象可能会变脏,请在保存后尝试刷新对象。

obj.save() obj.refresh_from_db()

参考资料:https://docs.djangoproject.com/en/1.8/ref/models/instances/#refreshing-objects-from-database

票数 0
EN

Stack Overflow用户

发布于 2015-10-19 14:15:49

这绝对是一种比赛条件。

如果只有一个脚本和一个数据库,您所描述的场景就永远不会发生。当您保存()时,该方法直到数据实际被提交到数据库时才返回。

但是,如果您使用的是主/从配置,则可能是复制延迟的受害者:如果您在主程序上写入,而在从服务器上读取,则完全可能您的脚本等待复制的时间不够长,并且您从从服务器读取旧的conf之后,它才有机会复制主服务器。

这样的配置可以使用数据库路由器在django中设置,也可以通过使用DB代理在DB端完成。看看那个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30215760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档