建立:
两者都使用django的ORM,相同的MySQL DB和相同的DB用户帐户(相同的settings.py
文件)
问题: B只能获取在运行之前插入的条目。好像B正在使用冻结的DB运行,在B首次连接到DB时冻结。
怎么会? 我可以在django中控制这种行为吗?
如果您正在重用相同的Manager对象,则必须记住it's caching。要解决这个问题,你必须手动更新。
这将在每次迭代中返回相同的结果:
while True:
same_every_time = AClass.objects.all().order_by('-id')[:5]
sleep(300)
为了使其正常工作,您必须添加更新:
while True:
AClass.objects.update()
updated_results = AClass.objects.all().order_by('-id')[:5]
sleep(300)
Django本身使用了一种容器管理的持久性。这意味着数据库事务在上游响应级联期间由中间件提交。
如果您自己使用Django ORM,则应确保实际提交事务:
from django.db import transaction
def my_task(whatever):
MyModel.objects.create(...)
# do whatever
transaction.commit()
return 'my_result'
我在尝试使用Django测试解决类似情况时发现了这个stackoverflow问题:在测试中,我修改了Django模型对象,但是更改没有反映在数据库中,因此第二个线程中的数据库读取器可以检测到更改。解决方案是从TransactionTestCase继承我的测试类,而不是默认的django.test.TestCase。