Junior — Middle
Este posibil să implementați tranzacții imbricate în sistem, și în ce cazuri este permis acest lucru?
sobes.tech AI
Răspuns de la AI
În biblioteca standard Go (pachetul database/sql), tranzacțiile imbricate nu sunt suportate direct, deoarece majoritatea sistemelor de gestionare a bazelor de date (SGBD) nu implementează tranzacții imbricate complete. În schimb, se folosesc adesea puncte de salvare (savepoints), care permit revenirea la o stare specifică în interiorul unei tranzacții.
Opțiuni posibile:
- Utilizarea savepoints dacă SGBD-ul le suportă (de exemplu, PostgreSQL, MySQL). În Go, acest lucru se poate face executând comenzi SQL
SAVEPOINT,ROLLBACK TO SAVEPOINT. - Imitarea tranzacțiilor imbricate prin tranzacții separate, dar acest lucru nu este întotdeauna corect din punct de vedere logic de afaceri.
Când este permis:
- Când trebuie să anulezi parțial modificările dintr-o tranzacție mare fără a o anula complet.
- În operațiuni complexe cu mai multe etape, unde fiecare etapă poate fi anulată separat.
Exemplu de utilizare a savepoints în Go:
trx, err := db.Begin()
if err != nil {
// gestionarea erorii
}
_, err = trx.Exec("SAVEPOINT sp1")
if err != nil {
trx.Rollback()
return err
}
// Executarea operațiilor
// În caz de eroare:
_, err = trx.Exec("ROLLBACK TO SAVEPOINT sp1")
// Continuare sau commit complet
err = trx.Commit()
Astfel, tranzacțiile imbricate sunt realizate prin savepoints, nu prin apeluri imbricate Begin/Commit.