Sobes.tech
Middle — Middle+

Jak zarządzać transakcjami w jednej metodzie, gdy używa się kilku operacji transakcyjnych, biorąc pod uwagę kontekst wykonania?

sobes.tech AI

Odpowiedź od AI

W Go, aby zarządzać transakcjami w ramach jednej metody z wieloma operacjami transakcyjnymi, zazwyczaj używa się obiektu transakcji uzyskanego z kontekstu bazy danych (np. *sql.Tx). Ważne jest przekazanie tego obiektu do każdej funkcji wykonującej operacje na bazie danych, aby wszystkie były częścią jednej transakcji.

Przykład:

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 {
    // Wykonanie zapytań SQL przez tx.Exec lub tx.Query
    return nil
}

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

W ten sposób wszystkie operacje są wykonywane w ramach jednej transakcji, a w przypadku błędu następuje rollback. Kontekst wykonania (context.Context) można używać do anulowania lub ustawiania limitu czasu, przekazując go do metod zapytań, ale obiekt transakcji musi być przekazany jawnie.