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
Libérer: 2024-12-08 15:45:13
original
930 Les gens l'ont consulté

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
}
Copier après la connexion

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
    })
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal