Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

179
Visualizações
Obtenga el siguiente elemento de trabajo en Django con PostgreSQL

Imagine que tiene una tabla simple con elementos de trabajo:

 |ID |OWNER|... +---+-----+--- |123| |... |456| |... |789| |...

Queremos proporcionar una API http para obtener el siguiente elemento de trabajo que aún no tiene propietario.

Usamos PostgreSQL.

Accedemos a la tabla con Django-ORM.

Supongo que hay varias condiciones de carrera si muchos usuarios acceden simultáneamente a la API.

¿Cómo puedo asegurarme con las herramientas proporcionadas (PostgreSQL, Django) de que se resuelven todas las condiciones de carrera (es una falla importante si un elemento de trabajo se entrega a dos o más usuarios)?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Con Django 1.11, select_for_update comenzó a admitir skip_locked . Esto significa que puede ahorrar en llamadas save() ya que no tiene que asignarlo a un propietario de inmediato.

Por ejemplo, construyendo sobre la respuesta de @user73657:

 with transaction.atomic(): work_item = WorkItem.objects.select_for_update().filter(owner__isnull=True).first() work_item.owner = request.user work_item.save(update_fields=['owner']) # process work_item

tu puedes hacer:

 with transaction.atomic(): work_item = WorkItem.objects.select_for_update(skip_locked=True).filter(owner__isnull=True).first() work_item.owner = request.user # process work_item, edit other fields work_item.save()

Con skip_locked=True , la transacción omite la fila bloqueada y, por lo tanto, no bloquea. Como beneficio adicional, solo tendrá que guardar en la base de datos una vez .

over 4 years ago · Santiago Trujillo Relatório

0

Con select_for_update :

 with transaction.atomic(): work_item = WorkItem.objects.select_for_update().filter(owner__isnull=True).first() work_item.owner = request.user work_item.save(update_fields=['owner']) # process work_item

https://docs.djangoproject.com/en/1.11/ref/models/querysets/#select-for-update

select_for_update se asegurará de que solo una conexión pueda actualizar las filas coincidentes hasta que finalice la transacción.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda