1

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

  • queue1 中的 Worker1 创建一个对象(MySQL INSERT)并将消息推送到 queue2
  • Worker2 接受 queue2 中的新消息并检索对象(MySQL SELECT),使用 Djangos 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() 中是否有任何缓存在这些版本之间有所不同?如果是这种情况,我可以通过某种方式清除它吗?

4

1 回答 1

1

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

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

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

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

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

于 2013-04-23T12:48:30.010 回答