Sobes.tech
Middle — Middle+

Πώς διαχειρίζεστε τις συναλλαγές μέσα σε μια μέθοδο όταν χρησιμοποιούνται πολλές συναλλαγικές λειτουργίες, λαμβάνοντας υπόψη το πλαίσιο εκτέλεσης;

sobes.tech AI

Απάντηση από AI

Στην Go, για τη διαχείριση συναλλαγών μέσα σε μια μέθοδο με πολλές συναλλαγές λειτουργίες, συνήθως χρησιμοποιείται ένα αντικείμενο συναλλαγής που λαμβάνεται από το πλαίσιο της βάσης δεδομένων (π.χ., *sql.Tx). Είναι σημαντικό να περνάτε αυτό το αντικείμενο σε κάθε λειτουργία που εκτελεί λειτουργίες με τη βάση δεδομένων, ώστε όλες να αποτελούν μέρος μιας ίδιας συναλλαγής.

Παράδειγμα:

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 {
    // Εκτέλεση SQL ερωτημάτων μέσω tx.Exec ή tx.Query
    return nil
}

func operation2(tx *sql.Tx) error {
    // Παρόμοια
    return nil
}

Έτσι, όλες οι λειτουργίες πραγματοποιούνται στο πλαίσιο μιας ίδιας συναλλαγής, και σε περίπτωση σφάλματος γίνεται rollback. Το πλαίσιο εκτέλεσης (context.Context) μπορεί να χρησιμοποιηθεί για ακύρωση ή ορισμό χρονικού ορίου, περνώντας το στις μεθόδους ερωτημάτων, αλλά το αντικείμενο συναλλαγής πρέπει να μεταδίδεται ρητά.