Здравствуйте!
Я фронтенд разработчик, в транзакциях ничего не понимаю(
Очень важная зона функциональности
Сценарий:
Есть 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. Напишите, пожалуйста, что-нибудь о своей квалификации в этой теме