Sobes.tech
Middle — Middle+

Kaip valdyti sandorius vienoje metodoje, kai naudojama kelios sandorių operacijos, atsižvelgiant į vykdymo kontekstą?

sobes.tech AI

Atsakymas iš AI

Go kalboje, norint valdyti transakcijas vieno metodo viduje su keliomis transakcijos operacijomis, paprastai naudojamas transakcijos objektas, gautas iš duomenų bazės konteksto (pavyzdžiui, *sql.Tx). Svarbu šį objektą perduoti kiekvienai funkcijai, kuri vykdo su duomenų baze susijusias operacijas, kad visi jie būtų vienos transakcijos dalis.

Pavyzdys:

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 {
    // Vykdyti SQL užklausas naudojant tx.Exec arba tx.Query
    return nil
}

func operation2(tx *sql.Tx) error {
    // Panašiai
    return nil
}

Taip, visi veiksmai vykdomi vienos transakcijos rėmuose, ir klaidos atveju atliekamas rollback. Vykdymo kontekstas (context.Context) gali būti naudojamas atšaukti arba nustatyti laiką limitą, perduodant jį į užklausų metodus, tačiau transakcijos objektas turi būti aiškiai perduotas.