自动提交事务的{Django save()行为

时间:2015-05-13 13:06:48

标签: mysql django django-models innodb

我有以下设置:

  • 多个数据处理工作人员通过http从django view get_conf()获取配置。
  • 使用MySQL / InnoDB后端将配置存储在django模型中
  • 配置模型已覆盖save()方法,该方法告知工作人员重新加载配置

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

我提出了以下可能导致此行为的可能情况:

  1. 保存新配置
  2. save()返回,但MySQL / InnoDB仍在处理(自动)提交
  3. 引导工作人员并为新配置发出http请求
  4. MySQL(自动)提交完成
  5. 上述场景中的第2步是否可行?也就是说,如果使用自动提交事务方法,django模型save()可以在数据实际提交到数据库之前返回吗?或者,为了实现一层,可以在提交完成之前完成MySQL自动提交INSERTUPDATE操作(更新/插入对其他事务可见)?

2 个答案:

答案 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端完成。检查一下。