0

Python 3.5、Django 1.8、および PostgreSql 9.4 を使用しています。

したがって、get リクエストでフォームをレンダリングし、ユーザーがフォームを送信すると更新される編集メソッドが 1 つあります。Hers のコード

def edit_case(request, case_id):
    case = get_object_or_404(Case, pk=case_id)
    if request.method == 'POST':
        data = request.POST.copy()
        form = CaseEditForm(data, instance=case)
        if form.is_valid():
            res = form.save()
            return HttpResponseRedirect(reverse("case_list"))
    else:
        form = CaseEditForm(instance=case)
    variables = RequestContext(request, {
        "form": form,
    })
    return render_to_response(
        'sample/edit_case.html',
        variables,
    )

あるユーザーが同時に何かを更新している場合、前のトランザクションが成功しない限り、他のユーザーが何かを更新できない場合、または悲観的ロックを使用するよりも他のより良い提案がある場合など、行レベルのロックを追加したいと考えています。

私は知ってselect_for_updateいますが、次の場合にどのように実装されるかわかりませんform.save()

どんな助けでも本当に感謝します

4

1 に答える 1

1

After so much research I have figured out the solution. So now while getting queryset against id I am using "select_for_update", something like this

with transaction.atomic():
    case = get_object_or_404(Case.objects.select_for_update(), pk=case_id)
    form = CaseEditForm(data, instance=case)
        if form.is_valid():
            res = form.save()
            return HttpResponseRedirect(reverse("case_list"))

So as you can see now I am fetching the query set object under the transaction and if any exception appear during transaction it will automatically rollback and Also as I am using select_for_update so it will lock the row until the transaction get succeeded or failed.

If anyone have better suggestion then kindly share it.

于 2016-11-25T09:43:47.567 に答える