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) метавонад барои бекор кардан ё муайян кардани мӯҳлати вақт истифода шавад, ки онро ба усулҳои саволҳо дода мешавад, аммо объект транзаксия бояд ба таври ошкор гузаронида шавад.