Sobes.tech
Middle — Middle+

Jak spravovat transakce v jedné metodě, když je použito několik transakčních operací, s ohledem na kontext provádění?

sobes.tech AI

Odpověď od AI

V Go se pro správu transakcí uvnitř jedné metody s více transakčními operacemi obvykle používá objekt transakce získaný z kontextu databáze (například *sql.Tx). Je důležité tento objekt předat každé funkci, která provádí operace s databází, aby všechny byly součástí jedné transakce.

Pří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 {
    // Provádění SQL dotazů přes tx.Exec nebo tx.Query
    return nil
}

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

Tímto způsobem jsou všechny operace prováděny v rámci jedné transakce a při chybě dojde k rollbacku. Kontext provádění (context.Context) lze použít k zrušení nebo nastavení časového limitu, předáváním jej metodám dotazů, ale objekt transakce musí být předán explicitně.