Блокировка строк в Джанго - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь реализовать это удивительное решение о блокировке строк , чтобы утверждать атомарные вставки, обусловленные количеством строк в 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?

...