O trabalhador demora muito (2 minutos), a transação fica na base em caso de falha — o que fazer?
sobes.tech IA
Resposta da IA
Se um trabalhador demora muito (cerca de 2 minutos) e, em caso de queda, a transação permanece na base de dados, isso significa que a transação não foi concluída corretamente (commit/rollback), e a base mantém bloqueios.
O que fazer:
- Usar um contexto com limite de tempo em Go para limitar o tempo de execução da transação. Por exemplo:
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
err := db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
// operações
return nil
})
-
Lidar com erros e garantir o rollback em caso de falhas.
-
Verificar os logs do banco de dados para identificar transações penduradas e encerrá-las manualmente, se necessário.
-
Considerar o uso de mecanismo de heartbeat ou verificação de saúde para o worker, para que, em caso de falha, as tarefas sejam reiniciadas automaticamente.
-
Otimizar o funcionamento do worker para que as transações não fiquem por muito tempo — talvez dividindo a tarefa em partes menores.
Assim, é importante controlar o tempo de vida das transações e encerrá-las corretamente para evitar bloqueios e estados presos.