我读过 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
方法本身应该是一个事务,然后,在下一个语句中,该对象应该存在于数据库。
最佳答案
好的。我发现了问题。我实际上还没有解释整个事情。自动提交模式工作正常。它会立即提交,除非存在事件事务。
我意识到我只在Django 的管理 中体验过这个。添加/更改 View 包含在事务中。因此,我在 post_save
信号中的代码在内部被触发,管理员的保存事务尚未完成。
这就是为什么无论如何都使用 transaction.on_commit
是有意义的(在 Django > 1.9 中添加),因为在这种情况下,它的参数函数将在外部事务结束后触发。
我正在使用 Django 1.6.5但这也发生在 1.11 中
希望这对其他人有帮助。
关于mysql - 如果启用了数据库自动提交模式,我为什么要关心 transaction.on_commit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44381949/