我读过Django> 1.9引入transaction.on_commit
以避免竞争条件。我知道Django默认情况下将数据库自动提交设置为true,因此每个查询都成为数据库级别的事务。
但是,举个例子,
from django.db import transaction
def some_view(request):
obj = SomeModel.objects.create(field=value)
transaction.on_commit(lambda: some_async_task(obj.pk))
为什么要将some_async_task(obj.pk)
包裹在transaction.on_commit
内?我不确定交易是如何在幕后工作的。这段时间我一直在想,当启用自动提交时,create
或save
方法应该是一个事务本身,然后,在下一个语句中该对象应存在于数据库中。
答案 0 :(得分:0)
确定。我发现了这个问题。我实际上并没有解释整个事情。自动提交模式正常工作。它立即提交,除非有活动交易。
我已经意识到我只是在 Django的管理员中解决了这个问题。添加/更改视图包含在事务中。所以,post_save
信号中的代码是在内部触发的,管理员的保存交易还没有完成。
这就是为什么使用transaction.on_commit
仍然有意义(在Django> 1.9中添加),因为在这种情况下,它的参数函数将在外部事务结束后被触发。
我使用Django 1.6.5但这也发生在1.11
中希望这有助于其他人。