Sobes.tech
Middle — Middle+

Kā pārvaldīt darījumus vienā metodē, kad tiek izmantotas vairākas darījumu operācijas, ņemot vērā izpildes kontekstu?

sobes.tech AI

Atbilde no AI

Go valodā, lai pārvaldītu transakcijas vienas metodes ietvaros ar vairākām transakcijas operācijām, parasti tiek izmantots transakcijas objekts, kas iegūts no datu bāzes konteksta (piemēram, *sql.Tx). Ir svarīgi šo objektu nodot katrai funkcijai, kas veic ar datu bāzi saistītas operācijas, lai visi tie būtu daļa no vienas transakcijas.

Piemērs:

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 {
    // Izpildīt SQL vaicājumus, izmantojot tx.Exec vai tx.Query
    return nil
}

func operation2(tx *sql.Tx) error {
    // Līdzīgi
    return nil
}

Tādējādi visas operācijas tiek veiktas vienas transakcijas ietvaros, un kļūdas gadījumā tiek veikts rollback. Izpildes konteksts (context.Context) var tikt izmantots atcelšanai vai laika ierobežojuma iestatīšanai, to nododot uz vaicājumu metodēm, bet transakcijas objekts ir jānodod skaidri.