2017-09-26 1 views
0

J'ai commencé à utiliser Go pour un service Web et ont une interaction de base de données (surprise !!!) et je l'ai trouvé cet exemple:Pourquoi reporter un rollback?

tx, err := db.Begin() 
if err != nil { 
    log.Fatal(err) 
} 
defer tx.Rollback() 
stmt, err := tx.Prepare("INSERT INTO foo VALUES (?)") 
if err != nil { 
    log.Fatal(err) 
} 
defer stmt.Close() // danger! 
for i := 0; i < 10; i++ { 
    _, err = stmt.Exec(i) 
    if err != nil { 
     log.Fatal(err) 
    } 
} 
err = tx.Commit() 
if err != nil { 
    log.Fatal(err) 
} 
// stmt.Close() runs here! 

De http://go-database-sql.org/prepared.html

L'exemple est bien formulé facile comprendre. Cependant, cela me laisse avec une question sans réponse. Pourquoi defer l'appel de Rollback de transaction?

Pourquoi ne pas juste faire ce qui suit:

err := tx.Commit() 

if err != nil { 
    log.Error(err) 
    tx.Rollback() 
} 

Would defer tx.Rollback() pas toujours tenter un retour en arrière? Même si tx.Commit() a été un succès, ou ai-je mal compris quelque chose à propos de defer?

+0

Cela ressemble à une erreur. Comme vous le dites, vous ne voudriez pas revenir en arrière à moins d'une erreur. Aussi le journal.Fatalf vous ne voudriez pas dans une vraie application. Je suggère d'utiliser le bouton d'amélioration de cette page et de contacter l'auteur. –

+0

Merci pour votre réponse :) –

Répondre

1

L'exemple est un peu trompeur. Il utilise log.Fatal(err) pour la gestion des erreurs. Normalement, vous ne le feriez pas, mais plutôt return err. Ainsi, le rollback différé est là pour s'assurer que la transaction est annulée en cas de retour anticipé.

+0

Ouais je connaissais le journal. Partie maternelle :) Merci beaucoup pour votre réponse –