Sobes.tech
Middle — Middle+

Kako upravljati transakcije unutar jedne metode kada se koristi više transakcijskih operacija, uzimajući u obzir kontekst izvršenja?

sobes.tech АИ

Одговор од АИ

U Go-u, za upravljanje transakcijama unutar jedne metode sa više transakcionih operacija, obično se koristi objekat transakcije dobijen iz konteksta baze podataka (npr., *sql.Tx). Važno je proslediti ovaj objekat svakoj funkciji koja vrši operacije sa bazom podataka, kako bi sve bile deo iste transakcije.

Primer:

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

    err = operation1(tx)
    if err != nil {
        return err
    }

    err = operation2(tx)
    if err != nil {
        return err
    }

    return nil
}

func operation1(tx *sql.Tx) error {
    // Izvršavanje SQL upita putem tx.Exec ili tx.Query
    return nil
}

func operation2(tx *sql.Tx) error {
    // Slično
    return nil
}

Na ovaj način, sve operacije se obavljaju u okviru jedne transakcije, i u slučaju greške vrši se rollback. Kontekst izvršenja (context.Context) može se koristiti za otkazivanje ili postavljanje timeout-a, prosleđivanjem u metode upita, ali objekat transakcije mora biti eksplicitno prosleđen.