Bien que l'utilisation de Go pour les services Web implique des interactions avec des bases de données, des exemples comme celui fourni dans go-database-sql.org présentent efficacement opérations de base de données. Cependant, une question courante se pose concernant l'objectif du report de l'appel d'annulation de transaction.
Le report de l'annulation de transaction garantit qu'elle s'exécutera quel que soit le flux de code ultérieur. Cela signifie que même si un retour anticipé se produit, le retour en arrière aura toujours lieu. Cependant, un point crucial à noter est que l'appel de tx.Rollback() sur une transaction déjà validée n'a aucun effet.
Le comportement du report peut être expliqué plus en détail. Lorsqu'une fonction revient, tous les appels différés s'exécuteront dans l'ordre inverse de leur report. Cela signifie que defer tx.Rollback() sera exécuté avant err := tx.Commit().
En différant la restauration, l'extrait de code évite le besoin de vérifie conditionnellement et garantit que la transaction sera annulée en cas d'erreur lors de l'exécution de l'instruction. Cela simplifie le code et garantit une bonne gestion de l'état de la base de données.
En fonction de la compréhension du report, l'extrait de code fourni peut être modifié comme suit :
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() for i := 0; i < 10; i++ { _, err = stmt.Exec(i) if err != nil { log.Fatal(err) } } err = tx.Commit() // stmt.Close() runs here!
Cette modification garantit que le code reste concis tout en conservant le comportement souhaité lors de l'exécution de tx.Rollback() en cas d'erreur lors de l'instruction exécution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!