在Djangos对象模型中缓存

时间:2013-04-22 22:58:20

标签: django

我正在运行一个系统,其中有一些工作人员从消息队列中获取作业,所有这些都使用Djangos ORM。 在一种情况下,我实际上是在另一个队列中将消息从一个工作者传递到另一个工作者。 它的工作原理如下:

  • queue1中的Worker1创建一个对象(MySQL INSERT)并将消息推送到queue2
  • Worker2接受queue2中的新消息,并使用Djangos objects.get(pk = object_id)
  • 检索对象(MySQL SELECT)

这适用于第一条消息。但是在第二个消息中,工作者2总是失败,因为它找不到具有id object_id的对象(使用Django异常DoesNotExist)。

这在我的本地设置中与Django 1.2.3和MySQL 5.1.66无缝协作,问题只发生在运行Django 1.3.1和MySQL 5.5.29的测试环境中。

如果我每次在worker1推送消息之前重新启动worker2,它都可以正常工作。这让我相信会有某种缓存。

Django的objects.get()中是否有任何缓存在这些版本之间有所不同?如果是这种情况,我可以用某种方式清除它吗?

1 个答案:

答案 0 :(得分:1)

该问题可能与MySQL事务的使用有关。在发件人的站点上,必须先将事务提交到数据库,然后通知接收者要读取的项目。在接收方,必须设置用于会话的事务级别,以便在发送方提交后,新数据在会话中可见。

默认情况下,MySQL使用REPEATABLE READ隔离级别。这会导致数据库中有多个进程读/写的问题。一种可能的解决方案是使用settings.py选项在Django DATABASES文件中设置隔离级别,如下所示:

'OPTIONS': {'init_command': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED'},

但请注意,更改事务隔离级别可能会产生其他副作用,尤其是在使用基于语句的复制时。

以下链接提供了更多有用的信息: