Sobes.tech
Senior

Worker pracuje dlho (2 minúty), transakcia zostáva v databáze pri páde — čo robiť?

sobes.tech AI

Odpoveď od AI

Ak pracovník pracuje dlho (okolo 2 minúty) a pri páde zostáva transakcia v databáze, znamená to, že transakcia nebola správne ukončená (commit/rollback), a databáza drží zámky.

Čo robiť:

  1. Použite kontext s časovým limitom v Go na obmedzenie doby trvania transakcie. Napríklad:
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

err := db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
    // operácie
    return nil
})
  1. Riešte chyby a zabezpečte rollback pri zlyhaní.

  2. Skontrolujte logy databázy na zaseknuté transakcie a v prípade potreby ich manuálne ukončite.

  3. Zvážte použitie heartbeat alebo health check mechanizmu pre pracovníka, aby pri páde boli úlohy automaticky reštartované.

  4. Optimalizujte prácu pracovníka, aby transakcie nezostávali dlho — možno rozdeľte úlohu na menšie časti.

Je dôležité sledovať dobu života transakcií a správne ich ukončiť, aby sa predišlo blokovaniu a zaseknutým stavom.