Maison >développement back-end >Golang >Comment puis-je déterminer en toute sécurité l'état d'une transaction de base de données/sql sans erreurs ?

Comment puis-je déterminer en toute sécurité l'état d'une transaction de base de données/sql sans erreurs ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-12 22:47:18357parcourir

How Can I Safely Determine the Status of a database/sql Transaction Without Errors?

database/sql Tx : Détection de l'état de la transaction

Question :

Comment pouvez-vous déterminer si une transaction utilisant base de données/sql a été validée ou annulée sans déclencher de erreur ?

Réponse :

Pour détecter l'état de la transaction, respectez les meilleures pratiques suivantes :

1. Conserver les transactions dans les fonctions :

Assurez-vous que Begin(), Commit() et Rollback() sont appelés dans la même fonction. Cela garantit que les transactions sont suivies de manière transparente.

2. Utiliser le report pour la clôture des transactions :

Incorporez une fonction de report pour effectuer un rollback si nécessaire. Cela garantit un traitement approprié des transactions.

3. Gestionnaire de transactions pour plus de concision :

Implémentez une fonction de gestionnaire de transactions pour encapsuler les transactions, garantissant ainsi la brièveté et une manipulation appropriée.

Exemple de code :

import "database/sql"

func Transact(db *sql.DB, txFunc func(*sql.Tx) error) (err error) {
    tx, err := db.Begin()
    if err != nil {
        return
    }
    defer func() {
        if p := recover(); p != nil {
            tx.Rollback()
            panic(p)
        } else if err != nil {
            tx.Rollback()
        } else {
            err = tx.Commit()
        }
    }()
    err = txFunc(tx)
    return err
}

Utiliser la transaction handler :

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

Gestion des paniques :

Utilisez recovery() pour capturer les paniques et assurer une restauration en temps opportun. Relancez la panique pour permettre la manipulation si elle est attendue.

Objet GC et Tx :

Régler Tx sur zéro après un commit ou un rollback ne libère pas automatiquement de la mémoire . Au lieu de cela, comptez sur le ramasse-miettes pour gérer cela.

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