Maison >développement back-end >Golang >Pourquoi le report est-il utilisé pour l'annulation des transactions dans les interactions avec la base de données Go ?

Pourquoi le report est-il utilisé pour l'annulation des transactions dans les interactions avec la base de données Go ?

DDD
DDDoriginal
2024-11-10 12:14:02439parcourir

Why is deferral used for transaction rollback in Go database interactions?

Pourquoi utiliser le report pour l'annulation des transactions ?

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.

Différer l'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.

Comprendre le report

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().

Importance du report

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.

Exemple de modification

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn