2013-10-25 23 views
3

我有一個線程評論系統,它可以在99.9%的時間內正常工作,但偶爾樹會中斷並且左/右值得到重複。django-mptt:處理併發插入

我發現,當兩個帖子同時發生(彼此間隔一秒鐘)時會發生這種情況,並且可能發生的情況是第二個帖子在第一個帖子之前更新了樹的左/右值已經完成了。

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。

+0

您是否找到解決方案或更好的解決方法? – Daviddd

+0

我在這個過程中遷移到了一個新的(更快的)主機並升級了django-mptt,問題消失了 - 可能僅僅是因爲數據庫更新運行速度更快(所以併發的機會大大減少),而不是真正解決的潛在問題。 – meepmeep

回答

1

transaction.autocommit()是標準的django行爲。如果全局事務行爲沒有被重新定義,你的裝飾器什麼也不做。 使用應該使用commit_on_success()修飾符。視圖中的所有數據庫操作都將處於一個事務中。 你可以閱讀更多關於https://docs.djangoproject.com/en/1.5/topics/db/transactions/

PS:在django 1.6交易管理將更新,注意。

+0

謝謝 - 但這是否會阻止其他數據庫事務(由其他會話調用)同時執行?基本上我試圖確保來自不同用戶的交易排隊,以便第二個交易完成前不會讀取不正確的左/右值。 – meepmeep

+0

有https://docs.djangoproject.com/en/1.5/ref/models/querysets/#select-for-update 它可以阻止記錄,但我不知道如何在django-mptt代碼中使用它。 – Hellpain