Maison >développement back-end >Golang >Comment puis-je détecter efficacement la validation ou l'annulation d'une transaction de base de données dans le package « database/sql » de Go ?

Comment puis-je détecter efficacement la validation ou l'annulation d'une transaction de base de données dans le package « database/sql » de Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-08 15:45:13925parcourir

How Can I Efficiently Detect Database Transaction Commit or Rollback in Go's `database/sql` Package?

Détection de la validation ou de l'annulation dans la base de données/sql Tx

Dans la base de données/sql, identifier si une transaction a été validée ou annulée nécessite une tentative supplémentaire et une erreur ultérieure analyse, ce qui peut être gênant. Cependant, il est possible d'optimiser ce processus.

Maintenir une variable distincte ou utiliser un gestionnaire de transactions

Maintenir une variable distincte pour l'état de la transaction peut être fastidieux, surtout dans des fonctions avec plusieurs transactions. Une alternative consiste à utiliser un gestionnaire de transactions, qui encapsule la gestion des transactions dans une fermeture :

func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) {
    // Begin transaction
    tx, err := db.Begin()
    if err != nil {
        return
    }
    // Define a handler for deferring commits or rollbacks
    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()
    // Execute transaction using the handler
    err = txFunc(tx)
    return err
}

En utilisant ce gestionnaire, les transactions peuvent être traitées de manière succincte :

func (s Service) DoSomething() error {
    return Transact(s.db, func(tx *sql.Tx) error {
        // Execute statements within the transaction
        if _, err := tx.Exec(...); err != nil {
            return err
        }
        if _, err := tx.Exec(...); err != nil {
            return err
        }
        return nil
    })
}

Récupération de mémoire GC pour les variables Tx nulles

Définition de la variable Tx sur zéro après une validation ou la restauration n'est pas recommandée. Le garbage collector récupérera automatiquement la mémoire associée à la transaction fermée.

Gestion des paniques dans les gestionnaires de transactions

Le gestionnaire de transactions fourni utilise recovery() pour gérer les paniques, garantissant ainsi une rollbacks et permettre au code de détecter les paniques attendues. Il est crucial d'éviter d'introduire des paniques dans les transactions et d'utiliser plutôt la gestion des erreurs.

Impact du report sur les valeurs de retour

Dans le gestionnaire de transactions, la valeur de retour est influencée par opérations différées en raison de la variable capturée. Les commits sont exécutés lorsqu'aucune erreur ne se produit (err = tx.Commit()), tandis que les rollbacks préservent toutes les erreurs existantes.

En mettant en œuvre ces stratégies, vous pouvez améliorer la gestion de vos transactions dans la base de données/sql, en garantissant la clarté et l'amélioration détection d'erreur.

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