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
Libérer: 2024-12-12 22:47:18
original
297 Les gens l'ont consulté

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

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

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!

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