Python django mptt:处理并发插入

Python django mptt:处理并发插入,python,django,django-mptt,Python,Django,Django Mptt,我有一个线程评论系统,99.9%的时间都可以正常工作,但偶尔树会崩溃,左/右值会重复 我发现当两个帖子同时发生时(彼此相隔不到一秒钟),可能发生的是第二个帖子在第一个帖子完成之前更新树的左/右值 My comment insert code fromviews.py如下所示: @login_required @transaction.autocommit def comment(request, post_id): parent = get_object_or_404(Post, pk=

我有一个线程评论系统,99.9%的时间都可以正常工作,但偶尔树会崩溃,左/右值会重复

我发现当两个帖子同时发生时(彼此相隔不到一秒钟),可能发生的是第二个帖子在第一个帖子完成之前更新树的左/右值

My comment insert code from
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

transaction.autocommit()是django的标准行为。若并没有重新定义全局事务行为,那个么装饰器什么也不做。 使用时应使用提交成功()。视图中的所有db操作都将在一个事务中。 你可以阅读更多关于


PS:在django 1.6中,事务管理将更新,请注意。

谢谢-但这是否会阻止其他数据库事务(由其他会话调用)同时执行?基本上,我正在尝试确保来自不同用户的事务排队,以便第二个用户在第一个事务完成之前不会读取不正确的左/右值。有一个问题是,它可能会阻止记录,但我不知道如何在django mptt代码中使用它。您找到解决方案了吗?或者更好地说,找到了一个解决方法?我迁移到了一个新的(更快的)系统在这个过程中托管并升级了django mptt,问题就消失了——可能只是因为数据库更新运行得更快(因此并发性的可能性大大降低),而不是因为实际的底层问题得到了解决。