在Django中以READ-COMITED级别开发项目时,我认为cache.delete会导致竞争条件,而Django的信号不会有多大帮助。
T1 T2
cache.delete
cache.get (not found)
read from database
cache.set (old value again)
commit
cache.get (old value)
如何确保缓存无效仅在事务提交时完成?
只有在事务提交后,才应从缓存中删除。为了确保您的事务已经提交(例如,如果您使用django.middleware.transaction.TransactionMiddleware
对每个请求进行提交),您可以使用commit_on_success
:强制提交
from django.db import transaction
with transaction.commit_on_success():
# ... do db stuff ...
cache.delete('key')