Лучший способ реализовать select_for_update() для извлечения и блокировки только одной строки в DJANGO ORMPython

Программы на Python
Anonymous
Лучший способ реализовать select_for_update() для извлечения и блокировки только одной строки в DJANGO ORM

Сообщение Anonymous »

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

Код: Выделить всё

chart_records = Chart.objects.select_for_update().filter(state_id=state_pk,
reviewer_id__isnull=True,
project_id=project, assignment_sequence__isnull=False)
.order_by('assignment_sequence')

# only one chart is updated in this case.
chart_serializer = ChartSerializer(chart_records[0], data=requested_data_new, partial=True)
if not chart_serializer.is_valid():
error = chart_serializer.errors
return error, message, chart_id
chart_serializer.save()

Мы подумали, что лучше ограничить строку до 1 при извлечении и блокировке.

Код: Выделить всё

chart_records = Chart.objects.filter(state_id=state_pk,
reviewer_id__isnull=True,
project_id=project, assignment_sequence__isnull=False)
.order_by('coder_assignment_sequence')[:1].select_for_update()
При этом генерируется запрос типа:

Код: Выделить всё

SELECT "id", "status", "state_id", "level_id"
FROM "chart"
WHERE ("healthcare_data_chart"."assignment_sequence" IS NOT NULL AND "project_id" = 167 AND "reviewer_id" IS NULL AND "state_id" = 2)
ORDER BY "coder_assignment_sequence"
ASC LIMIT 1 FOR UPDATE 

Подробнее здесь: [url]https://stackoverflow.com/questions/78548628/better-way-to-implement-select-for-update-to-fetch-and-lock-only-one-row-in-dj[/url]

Вернуться в «Python»