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

标签 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 方法本身应该是一个事务,然后,在下一个语句中,该对象应该存在于数据库。

最佳答案

好的。我发现了问题。我实际上还没有解释整个事情。自动提交模式工作正常。它会立即提交,除非存在事件事务。

我意识到我只在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/

相关文章:

mysql - 如何将所有行的排序规则从 latin1_swedish_ci 更改为 utf8_unicode_ci?

python - Django 表单测试生成带有外键模型字段的错误

python - Postgresql 安装的默认位置?

c# - SQLiteCommand.Transaction 需要吗?

python - 如何在 PhpMyAdmin 中组织 CSV 的 Twitter 数据

java - JTable 在 INSERT 后隐藏表头

python - Django 转换为 CBV + 测试

spring - 贾西格 CAS。如何使用 JpaTicketRegistry 启用交易?

python - Django 中的多个数据库破坏了测试隔离。如何解决?

mysql - Perl DBI - 并行事务