@vs101ff
Frontend разработчик

Как правильно организовать транзакции / блокировки Postgres в моем сценарии?

Здравствуйте!

Я фронтенд разработчик, в транзакциях ничего не понимаю(

Очень важная зона функциональности

Сценарий:
Есть 2 одинаковых обработки, которые могут во времени наложиться друг на друга, включая частичное пересечение; или сначала 1, потом 2, с временным интервалом - т.е. в любое время 1 относительно 2. Вызовы - webhook.

Обработка на python django (развертка кода):
Table2 Table1 1-to-many . Больше таблиц не участвует.
x = Table1.objects.filter(id=id).first()
# field1 гарантированно True до выполнения первой обработки
field1 = x.field1
x.field1 = False
x.field2 = request.data['qwerty']
x.save()

@receiver(signals.pre_save, Sender = Table1)
def pre_save_table1(sender, instance):
  obj = sender.objects.get(pk=instance.pk)
# ^ если первая обработка (определяем это по полям-не отношениям obj), ничего, иначе:
  y = Table2.objects.get(pk = obj.table2.pk)
  y.field1 -= obj.field0

@receiver(signals.post_save, Sender = Table1)
def post_save_table1(sender, instance):
  # ^ проверки по полям-не отношениям instance, все true в рамках сценария
  y = Table2.objects.get(pk = instance.table2.pk)
  y.field1 += instance.field0

if field1:
  if x.field2 == 'qwerty3' and x.field3 >= 0:
    y = Table2.objects.filter(id=x.table2.id).first()
    #  filter(…) - без отношений таблиц 
    qty = Table1.objects.filter(table2=y).filter(…).count()
    if qty == 1:
      y.field2='qwerty4'
      y.field3='qwerty5'
      y.save()


Легенда:
# ^ - комментарий, вместо которого в ПО код

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

Django 4

P.S. Напишите, пожалуйста, что-нибудь о своей квалификации в этой теме
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
в транзакциях ничего не понимаю(
ну сначала садись и разбирайся, в доках всё расписано. Как ты дальше хочешь поддерживать код, который не понимаешь?

в любой момент времени все успешно, или никаких изменений
оберни этот участок в with transaction.atomic():

А для того чтобы другой обработчик не поменял данные, которые используют первый, делай блокировку этих данных на время обработки, через select_for_update
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы