Sobes.tech
Middle — Middle+

İcra kontekstini nəzərə alaraq, bir neçə tranzaksiya əməliyyatı istifadə edilərkən, tək bir metod daxilində tranzaksiyaları necə idarə etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da, bir metod daxilində bir neçə tranzaksiya əməliyyatını idarə etmək üçün adətən verilənlər bazası kontekstindən alınmış tranzaksiya obyekti, məsələn, *sql.Tx istifadə olunur. Bu obyekti hər bir verilənlər bazası əməliyyatı həyata keçirən funksiyaya keçirmək vacibdir ki, hamısı eyni tranzaksiyanın hissəsi olsun.

Nümunə:

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 {
    // tx.Exec və ya tx.Query vasitəsilə SQL sorğularını icra etmək
    return nil
}

func operation2(tx *sql.Tx) error {
    // Oxşar
    return nil
}

Beləliklə, bütün əməliyyatlar eyni tranzaksiyada həyata keçirilir və xəta baş verdikdə rollback edilir. İcra konteksti (context.Context) ləğv etmək və ya zaman limiti təyin etmək üçün istifadə oluna bilər, onu sorğu metodlarına ötürür, lakin tranzaksiya obyekti açıq şəkildə ötürülməlidir.