如果启用了数据库自动提交模式,我为什么要关心transaction.on_commit()?

时间:2017-06-06 05:26:29

标签: mysql django transactions

我读过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内?我不确定交易是如何在幕后工作的。这段时间我一直在想,当启用自动提交时,createsave方法应该是一个事务本身,然后,在下一个语句中该对象应存在于数据库中。

1 个答案:

答案 0 :(得分:0)

确定。我发现了这个问题。我实际上并没有解释整个事情。自动提交模式正常工作。它立即提交,除非有活动交易。

我已经意识到我只是在 Django的管理员中解决了这个问题。添加/更改视图包含在事务中。所以,post_save信号中的代码是在内部触发的,管理员的保存交易还没有完成。

这就是为什么使用transaction.on_commit仍然有意义(在Django> 1.9中添加),因为在这种情况下,它的参数函数将在外部事务结束后被触发。

我使用Django 1.6.5但这也发生在1.11

希望这有助于其他人。