import pickle
import os
big_data = os.urandom(10000000)
def run():
pickle.loads(pickle.dumps(big_data))
t = timeit.Timer(run)
[threading.Thread(target=lambda: t.timeit(number=2000)).start() for _ in range(4)]
期望:完成def some_view(request):
with transaction.atomic():
data = do_some_stuff(request)
data2 = do_some_stuff2(request)
async_task.delay(data, data2)
return Response({'data': data, 'data2': data2})
块后,所有数据库修改都将提交给数据库。
现实:正在准备将响应发送到浏览器(序列化)时,异步任务已经开始执行。异步任务期望所有修改都已经完成,但是还没有完成。仅当浏览器收到对数据库的实际with
响应时。
我了解commit
钩子,但问题是为什么transaction.on_commit(func)
完成后为什么不能确定数据库中的数据实际上已更新?记下with transaction.atomic()
关于Django 1.11.20和postgresql 10,我不知道它是否与Django 2+相同。