2013-09-05 3 views
2

При разработке вашего проекта в Django с уровнем READ-COMITTED, я думаю, cache.delete может привести к состоянию гонки, а сигналы django не помогут.Неверное действие кэша Django при совершении транзакции?

T1       T2 
          cache.delete 
cache.get (not found) 
read from database 
cache.set (old value again) 
          commit 
          cache.get (old value) 

Как я могу гарантировать, что недействительность кэша выполняется только в момент совершения транзакции?

ответ

0

Вы должны удалять только кеш при совершении транзакции. Чтобы обеспечить сделки было совершено (например, в случае, если вы используете django.middleware.transaction.TransactionMiddleware совершить при каждом запросе), вы можете принудительно коммит с помощью commit_on_success:

from django.db import transaction 
with transaction.commit_on_success(): 
    # ... do db stuff ... 

cache.delete('key') 
+0

Ну, это звучит как совершить, по-прежнему, что Wouldn 'Позвольте мне откат в будущей части среды выполнения. Кажется, мне нужно что-то вроде управления версиями или промежуточного ПО управления кэшем. – hurturk

+0

Казалось бы, вам нужно определить, что делать с кешированным значением, если вы откат. –