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) կարող է օգտագործվել չեղարկելու կամ ժամանակային սահման սահմանելու համար, փոխանցելով այն հարցումների մեթոդներին, բայց տրանզակցիայի օբյեկտը պետք է փոխանցվի բացահայտորեն։