Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django-mptt: dealing with concurrent inserts

I have a threaded comment system which works fine 99.9% of the time, but very occasionally the tree breaks down and left/right values get duplicated.

I have discovered that this happens when two posts happen at the same time (within a second of each other), and presumably what is happening is that the second post is updating the left/right values of the tree before the first has completed doing so.

My comment insert code from views.py is the following:

@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))

What is the correct approach to dealing with this? Is there a django way to ensure that the second view does not get called until the first database transaction is complete? Or should I rebuild the tree after each insert to ensure integrity? Or is there a better insert method to be using?

Thanks!

edit: I'm using MySQL.

like image 833
meepmeep Avatar asked Jan 31 '26 12:01

meepmeep


1 Answers

transaction.autocommit() is a standard django behavior. You decorator does nothing, if global transaction behavior was not redefined. Use should use commit_on_success() decorator. All db operations in view will be in one transaction. You can read more on https://docs.djangoproject.com/en/1.5/topics/db/transactions/

PS: In django 1.6 transaction management will be updated, be attentive.

like image 151
Sergei Avatar answered Feb 02 '26 00:02

Sergei



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!