Descrição
WorkflowViewSet.save_graph() faz delete de TODAS as arestas e recria em seguida. Requisições concorrentes podem causar perda de dados.
Edge.objects.filter(workflow=workflow).delete()
# ← janela de race condition aqui
Edge.objects.bulk_create(new_edges)
Impacto
- Arestas podem sumir se duas requisições concurrentes dispararem saves
- Inconsistência entre frontend e banco
Correção sugerida
- Envolver em transação atômica
transaction.atomic()
- Usar
update_or_create com diffing em vez de delete+recreate
- Adicionar optimistic locking com version field
Referência
- views.py: `WorkflowViewSet.save_graph()`
Descrição
WorkflowViewSet.save_graph()faz delete de TODAS as arestas e recria em seguida. Requisições concorrentes podem causar perda de dados.Impacto
Correção sugerida
transaction.atomic()update_or_createcom diffing em vez de delete+recreateReferência