Sobes.tech
Senior

Le travailleur fonctionne longtemps (2 minutes), la transaction reste dans la base en cas de panne — que faire?

sobes.tech IA

Réponse de l'IA

Si un travailleur fonctionne longtemps (environ 2 minutes), et en cas de panne, la transaction reste dans la base de données, cela signifie que la transaction n'a pas été correctement terminée (commit/rollback), et la base maintient des verrouillages.

Que faire :

  1. Utiliser un contexte avec un délai d'expiration en Go pour limiter le temps d'exécution de la transaction. Par exemple :
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

err := db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
    // opérations
    return nil
})
  1. Gérer les erreurs et garantir le rollback en cas d'échec.

  2. Vérifier les logs de la base de données pour détecter les transactions bloquées et les terminer manuellement si nécessaire.

  3. Envisager l'utilisation d'un mécanisme de heartbeat ou de vérification de santé pour le worker, afin que, en cas de panne, les tâches soient redémarrées automatiquement.

  4. Optimiser le fonctionnement du worker pour que les transactions ne durent pas longtemps — peut-être en divisant la tâche en parties plus petites.

Il est donc important de contrôler la durée de vie des transactions et de les terminer correctement pour éviter les blocages et les états bloqués.