2013-04-22 67 views
1

我正在運行一個系統,其中有幾個工作人員正在使用Djangos ORM從消息隊列中獲取作業。 在一種情況下,我實際上將一個工作人員的消息傳遞給另一個工作人員。 它的工作原理是這樣的:在Djangos對象模型中緩存

  • Worker1在隊列1創建一個對象(MySQL的INSERT)並按下消息隊列2
  • Worker2在隊列2接受新的消息,並獲取對象(MySQL的SELECT),使用Django的對象.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()在這些版本中有不同的緩存嗎?如果是這樣的話,我可以以某種方式清除它嗎?

+3

你確保你之前提交事務**添加第二個任務?也許你只在本地設置一名工人,並且有多名工人在生產。 – 2013-04-22 23:00:54

+0

另外,確保Django端的MySQL事務設置是正確的。有些人似乎有讀取事務隔離的問題。見http://stackoverflow.com/q/3346124/302243 – 2013-04-23 00:12:06

+0

謝謝你們!我們是正確的,我需要手動確認事務已提交,然後再提交給其他工作人員。 @AustinPhillips您的鏈接幫助了很多,如果您願意,請將其填入答案中,我會給予您信任 – Niklas9 2013-04-23 11:30:22

回答

1

該問題可能與使用MySQL事務有關。在發件人的網站上,交易必須先提交給數據庫,然後再通知接收者要閱讀的項目。在接收端,必須設置用於會話的事務級別,以便在發送者提交之後,新數據在會話中變得可見。

默認情況下,MySQL使用的隔離級別爲REPEATABLE READ。這在存在多個讀取/寫入數據庫的進程時會造成問題。一個可能的解決方案是使用DATABASES選項類似如下設置Django的settings.py文件的隔離級別:但是

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

請注意,更改事務隔離級別可能有其他的副作用,使用基於語句複製時尤其如此。

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