Я пытаюсь реализовать это удивительное решение о блокировке строк , чтобы утверждать атомарные вставки, обусловленные количеством строк в Django, при использовании PostgreSQL в качестве бэкэнда БД. Я протестировал решение в оболочке PostgresSQL следующим образом:
BEGIN;
SELECT * FROM teams WHERE id = 3 FOR NO KEY UPDATE;
-- other stuff
COMMIT;
и это работало как прелесть: при выполнении того же кода в другой оболочке он блокировался (именно то, что я ищу), пока я не запустил COMMIT;
в моей первой оболочке.
Однако я не могу заставить его работать в Джанго. Я пробовал разные подходы, такие как:
1 - Выполнение всего алгоритма в виде необработанного SQL:
with connection.cursor() as cursor:
cursor.execute("BEGIN;")
cursor.execute("SELECT * FROM app_team WHERE id = 1 FOR NO KEY UPDATE;")
#other stuff
cursor.execute("COMMIT;")
2 - Завершение этого с помощью оператора with transaction.atomic():
вместо необработанных BEGIN;
и COMMIT;
запросов
3- Использование Django по умолчанию select_for_update
:
with transaction.atomic():
team = Team.objects.select_for_update().get(id=1)
Какой лучший способ реализовать такой механизм в Django?