django-mptt:处理并发插入

时间:2013-10-25 15:23:14

标签: python django django-mptt

我有一个线程评论系统,可以在99.9%的时间内正常工作,但偶尔会出现故障,左/右值会重复。

我发现当两个帖子同时发生(彼此之间的一秒)时会发生这种情况,并且可能发生的事情是第二个帖子在第一个帖子之前更新树的左/右值完成了这样做。

我的评论来自views.py的插入代码如下:

@login_required
@transaction.autocommit
def comment(request, post_id):
    parent = get_object_or_404(Post, pk=post_id)

    if request.method == 'POST':
        form = PostForm(request.POST)

        form.parent = post_id
        if form.is_valid():
            new_post = newPost(request.user, form.cleaned_data['subject'], form.cleaned_data['body'])
            new_post.insert_at(parent, 'last-child', save=True)
            return HttpResponseRedirect('/posts/')
    else:
        form = PostForm()

    return render_to_response('posts/reply.html', {'requestPost': request.POST, 'form': form, 'parent': parent}, context_instance=RequestContext(request))

处理此问题的正确方法是什么?是否有django方法来确保在第一个数据库事务完成之前不会调用第二个视图?或者我应该在每次插入后重建树以确保完整性?或者是否有更好的插入方法可供使用?

谢谢!

编辑:我正在使用MySQL。

1 个答案:

答案 0 :(得分:1)

transaction.autocommit()是标准的django行为。如果未重新定义全局事务行为,则装饰器不执行任何操作。 使用时应使用 commit_on_success()装饰器。视图中的所有数据库操作都将在一个事务中。 您可以在https://docs.djangoproject.com/en/1.5/topics/db/transactions/

上阅读更多内容

PS:在django 1.6中,交易管理会更新,请注意。