Выполнение проверки данных после сохранения объекта в атомарной транзакции. Django и PostgreSQL

Поток тока, который я использую, выглядит следующим образом:

# Here there is a long and complicated verification to check that the submitted data is valid,
# involving lots of calculations and queries.

with transaction.atomic():
    # save the submitted data

Но вместо этого я могу сделать

def saved_data_is_valid():
    # some short and simple calculations.

...


# skip the validation before saving data.
with transaction.atomic():
    # save the submitted data in the database without commiting it.
    if not saved_data_is_valid():
        raise Exception("Some exception so the transaction will roll back")

Интересно, каков будет удар по производительности базы данных со всеми мертвыми строками, которые это создаст, учитывая, что AUTOVACUUM это ON, а default_transaction_isolation это read committed.

Также учитывая, что представленные данные в большинстве случаев являются достоверными.

Наиболее оптимальным способом обработки проверки данных после сохранения объекта в атомарной транзакции при использовании Django и PostgreSQL является использование метода validate_unique(). Этот метод позволяет выполнить проверку данных по полям объекта после его сохранения в атомарной транзакции.

Вот пример использования метода validate_unique() в Django для выполнения проверки данных после сохранения объекта в атомарной транзакции:

from django.db import transaction

@transaction.atomic
def save_object(object):
    object.save()
    object.validate_unique()

В этом примере функция save_object() сохраняет объект в атомарной транзакции с использованием декоратора @transaction.atomic. После сохранения объекта вызывается метод validate_unique() для выполнения проверки данных в полях объекта. Это гарантирует, что данные в объекте действительны после их сохранения в базе данных.

Использование метода validate_unique() таким образом позволяет вам обрабатывать проверку данных надежным и эффективным образом, гарантируя, что данные в вашей базе данных всегда достоверны.

Обычно считается лучшей практикой проверять данные перед сохранением их в базе данных, а не полагаться на атомарную транзакцию для отката недействительных данных. Это связано с тем, что откат транзакции может быть ресурсоемким и при частом выполнении может вызвать проблемы с производительностью.

Кроме того, тот факт, что большая часть представленных данных, как правило, действительна, не имеет значения, поскольку достаточно одного экземпляра недействительных данных, чтобы вызвать откат транзакции. Это означает, что даже если большинство данных достоверны, влияние на производительность при использовании этого подхода все равно может быть значительным.

<

В общем случае лучше проверять данные перед тем, как пытаться сохранить их в базе данных. Это поможет обеспечить сохранение только достоверных данных и избежать проблем с производительностью, которые могут возникнуть при использовании атомарных транзакций для отката недействительных данных.

Вернуться на верх