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!