django对象模型中的缓存



我正在运行一个系统,其中有几个工人从消息队列中获取工作,所有使用django的ORM。在一种情况下,我实际上是将消息从一个工人传递到另一个队列中的另一个工人。它是这样工作的:

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

这对第一条消息有效。但是在第二个消息中,worker 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()中是否有不同的缓存?如果是这样的话,我能不能用什么方法来澄清?

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

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

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

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

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

  • 如何强制Django忽略缓存并重新加载数据?
  • Django票# 13906

最新更新