Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

167
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!