我有一个 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_manually
、select_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/