Sobes.tech
Senior

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:

  1. 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
})
  1. Lidar com erros e garantir o rollback em caso de falhas.

  2. Verificar os logs do banco de dados para identificar transações penduradas e encerrá-las manualmente, se necessário.

  3. 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.

  4. 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.