3

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

为了保护自己免受竞争条件的影响,我使用的代码大致如下:

@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 在事务之间触发的信号;我不能只是运行它并希望出现并发问题并得到处理。

4

1 回答 1

0

为什么不在那里使用commit_on_success

我认为查询本身应该如下所示:

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

我不认为 django 对select_for_update你可以断言的内容有什么特别的。我脑海中唯一的断言是assertTrue(queryset.query.select_for_update)。它什么都不测试,只有在有人意外(?)删除呼叫时才可能有用。

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

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

于 2012-11-20T18:57:17.487 回答