Sobes.tech
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.