В транзакции django с функцией select_for_update обнаружена мертвая блокировка
У меня есть две функции: одна для обновления данных, другая для чтения данных. При их одновременном выполнении в двух потоках возникает тупик. Кто-нибудь знает, почему? Уровень изоляции базы данных установлен на REPEATABLE-READ. Функция sleep используется для увеличения вероятности возникновения тупика.
@transaction.atomic()
def func_change_data():
print("start")
time.sleep(10)
boos = Boo.objects.select_for_update(skip_locked=True).filter(pk=xxx)
if not changes.exists():
return
print("sleep")
time.sleep(10)
boo = boos.first()
boo.stage = 'stage_2'
boo.save()
print("end")
@transaction.atomic()
def func__read():
boo = Boo.objects.select_for_update().get(
pk=xxx,
target_branch='master',
stage='stage_1'
)
time.sleep(10)
print("end sleep")