Sobes.tech
Middle — Middle+

Ijro kontekstini hisobga olgan holda, bir nechta tranzaksiya operatsiyasini o'z ichiga olgan bitta metod ichida tranzaktsiyalarni qanday boshqarish mumkin?

sobes.tech AI

AIdan javob

Go'da, bir metod ichida bir nechta tranzaksiya operatsiyalarini boshqarish uchun odatda ma'lumotlar bazasi kontekstidan olingan tranzaksiya obyekti, masalan, *sql.Tx, ishlatiladi. Bu obyekti har bir ma'lumotlar bazasi operatsiyasini amalga oshiradigan funktsiyaga uzatish muhim, shunda ular barchasi bir tranzaksiyaning qismi bo'ladi.

Misol:

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 yoki tx.Query orqali SQL so'rovlarni bajarish
    return nil
}

func operation2(tx *sql.Tx) error {
    // Shunga o'xshash
    return nil
}

Shu tarzda, barcha operatsiyalar bir tranzaksiyada amalga oshiriladi va xatolik yuzaga kelsa rollback amalga oshiriladi. Ishlash konteksti (context.Context) bekor qilish yoki timeout belgilash uchun ishlatilishi mumkin, uni so'rov metodlariga uzatish, ammo tranzaksiya obyekti aniq uzatilishi kerak.