1

我正在使用 Django 1.3 开发一个 Web 应用程序,并且我有一个如下所示的处理程序:

@transaction.commit_manually
@login_required(redirect_field_name='')
def problematic_handler(request):
    try:
        my_record = models.MyRecords.objects.get(...)
        # lots of database operations based on my_record
        my_record.delete()
        transaction.commit()
        return ...
    except:
        transaction.rollback()
        return ...

我的问题是用户可以在第一次调用甚至返回之前多次调用 questions_handler() ,这将生成比需要更多的数据库记录。

不幸的是,PRG 模式在这里没有帮助:/

有什么方法可以限制用户在等待第一个调用返回的同时调用处理程序两次?或者是否有可能在处理程序的第二次调用期间产生异常?(来源假设第一个尚未完成)

4

1 回答 1

0

我建议您尝试在事务中执行一个QuerySet.select_for_update应该在事务期间锁定您检索my_record到的实例的事务。这将禁用连续调用以problematic_handler获取额外的锁,并django.db.DatabaseError在尝试中引发异常,您可以在其中设计适当的事后分析过程。

对于 1.4 之前的 Django 版本,如果您的数据库支持,我建议您尝试为数据库记录的更新查询执行原始 SQL 选择。否则,您需要在应用程序级别和 ymmv 实现锁定,以防您的应用程序在多进程上下文中运行。

于 2013-09-19T15:15:04.547 回答