From 926d61f5349a49b7bc6a570c957c92ff406d37c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E7=91=AA=E8=B2=93?= Date: Mon, 24 Aug 2020 22:26:07 +0800 Subject: [PATCH] Moved the database transaction control from the save() method in the data model to the form view, to avoid double transactions. --- accounting/models.py | 31 ++++++++++++++----------------- mia_core/views.py | 4 +++- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/accounting/models.py b/accounting/models.py index 16c6065..d48b05d 100644 --- a/accounting/models.py +++ b/accounting/models.py @@ -178,17 +178,16 @@ class Transaction(DirtyFieldsMixin, BaseModel): for record in to_save: record.current_user = self.current_user # Runs the update - with transaction.atomic(): - super().save(force_insert=force_insert, force_update=force_update, - using=using, update_fields=update_fields) - for record in to_delete: - record.delete() - for record in to_save: - record.save(force_insert=force_insert, - force_update=force_update, - using=using, update_fields=update_fields) - for x in txn_to_sort: - Transaction.objects.filter(pk=x[0].pk).update(ord=x[1]) + super().save(force_insert=force_insert, force_update=force_update, + using=using, update_fields=update_fields) + for record in to_delete: + record.delete() + for record in to_save: + record.save(force_insert=force_insert, + force_update=force_update, + using=using, update_fields=update_fields) + for x in txn_to_sort: + Transaction.objects.filter(pk=x[0].pk).update(ord=x[1]) def delete(self, using=None, keep_parents=False): txn_same_day = list( @@ -199,12 +198,10 @@ class Transaction(DirtyFieldsMixin, BaseModel): for i in range(len(txn_same_day)): if txn_same_day[i].ord != i + 1: txn_to_sort.append([txn_same_day[i], i + 1]) - with transaction.atomic(): - for record in self.record_set.all(): - record.delete() - super().delete(using=using, keep_parents=keep_parents) - for x in txn_to_sort: - Transaction.objects.filter(pk=x[0].pk).update(ord=x[1]) + Record.objects.filter(transaction=self).delete() + super().delete(using=using, keep_parents=keep_parents) + for x in txn_to_sort: + Transaction.objects.filter(pk=x[0].pk).update(ord=x[1]) def fill_from_post(self, post: Dict[str, str], request: HttpRequest, txn_type: str): diff --git a/mia_core/views.py b/mia_core/views.py index 52c311c..9df380b 100644 --- a/mia_core/views.py +++ b/mia_core/views.py @@ -24,6 +24,7 @@ from dirtyfields import DirtyFieldsMixin from django import forms from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin +from django.db import transaction from django.db.models import Model from django.http import HttpResponse, HttpRequest, \ HttpResponseRedirect, Http404 @@ -157,7 +158,8 @@ class FormView(View): and not self.object.is_dirty(check_relationship=True): message = self.get_not_modified_message(form.cleaned_data) else: - self.object.save() + with transaction.atomic(): + self.object.save() message = self.get_success_message(form.cleaned_data) messages.success(self.request, message) return redirect(str(UrlBuilder(self.get_success_url())