Sobes.tech
Middle — Middle+

Ako spravovať transakcie v jednej metóde, keď sa používa viacero transakčných operácií, s ohľadom na kontext vykonávania?

sobes.tech AI

Odpoveď od AI

V Go-u sa správou transakcií v rámci jednej metódy s viacerými transakčnými operáciami sa zvyčajne používa objekt transakcie získaný z kontextu databázy (napríklad *sql.Tx). Je dôležité tento objekt odovzdať každej funkcii, ktorá vykonáva operácie s databázou, aby všetky boli súčasťou jednej transakcie.

Príklad:

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 {
    // Vykonávanie SQL dopytov pomocou tx.Exec alebo tx.Query
    return nil
}

func operation2(tx *sql.Tx) error {
    // Podobne
    return nil
}

Týmto spôsobom sa všetky operácie vykonávajú v rámci jednej transakcie a pri chybe sa vykoná rollback. Kontext vykonávania (context.Context) možno použiť na zrušenie alebo nastavenie časového limitu, odovzdávaním do metód dopytov, ale objekt transakcie musí byť explicitne odovzdaný.