python - Django 事务和并发

标签 python database django concurrency

我有一个 View 需要对涉及需要锁定的共享资源的数据库执行更新(实现很复杂,但本质上只不过是一个共享计数器)。

为了避免竞争条件,我使用的代码大致如下所示:

@transaction.commit_manually
def do_it(request):
    affected_models = Something.objects.select_for_update(blah = 1)

    for model in affected_models:
        model.modify()
        model.save()

    transaction.commit()

commit_manuallyselect_for_update()save() 的用法是否正确?我怎样才能编写一个测试来证实这一点?例如,我找不到 Django 在交易之间触发的信号;我不能只是运行它并希望并发问题出现并得到处理。

最佳答案

为什么不在那里使用 commit_on_success

我认为查询本身应该是这样的:

Something.objects.select_for_update().filter(...)

我不认为 django 在 select_for_update 上做了什么你可以断言的事情。我想到的唯一断言是 assertTrue(queryset.query.select_for_update)。它不测试任何东西,只有当有人意外(?)删除调用时才可能有用。

即使您为这个运行条件问题提出了一些单元测试,我也不认为将其放入项目中是明智的。

而是专注于测试您的代码,而不是数据库行为。

关于python - Django 事务和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13179401/

相关文章:

python - Pandas 用列表设置单元格的值范围

mysql - 如何对3个不同日期的子查询进行减法和除法?

php - 在 php 中,我可以在从 url 获取变量的同时循环更新数据库吗?

python - Django URLField 不接受仅主机名的 URL

python - 如何使用 django 通用 View ?

python - 对聚合值进行聚合

python - 打破 python 多处理管理器列表

python - docker 卡在 django runserver 上

database - 在 aerospike 中插入或更新数据

python - Django 中属性的 bool 组合