Sobes.tech
Middle — Middle+

Ишке ашыккан контекстти эске алганда, бир нече транзакциялык операцияны колдонуп жатканда, бир методтун ичинде транзакцияларды кантип башкаруу керек?

sobes.tech AI

AIден жооп

Go'da, bir metod ichida birnecha tranzaksiya operatsiyalaryn yönetmek üçin adatça, maglumatlar bazasy kontekstinden alnan tranzaksiýa obýekti, meselem, *sql.Tx ulanylýar. Bu obýekti her bir maglumatlar bazasy operasiýasyny amala aşyrýan funksiýa geçirmäge möhüm, şonda hemmesi bir tranzaksiýanyň bölegi bolar.

Mysal:

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 soraglaryny tx.Exec ýa-da tx.Query arkaly ýerine ýetirmek
    return nil
}

func operation2(tx *sql.Tx) error {
    // Şol bir
    return nil
}

Şeýlelikde, ähli operasiýalar bir tranzaksiýanyň çäginde amala aşyrylýar, we ýalňyşlyk ýüze çykanda rollback edilýär. Işleme konteksti (context.Context) ýatyryp ýa-da wagt çägini goýmak üçin ulanylyp bilner, sorag metodlaryna geçirip, emma tranzaksiýa obýekti açyk geçirilmelidir.