Sobes.tech
Middle — Middle+

Çalışma bağlamını dikkate alarak, birden fazla işlem içeren bir yöntemde işlemleri nasıl yönetirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da, bir metod içinde birden fazla işlemi içeren işlemleri yönetmek için genellikle veritabanı bağlamından alınan bir işlem nesnesi (örneğin, *sql.Tx) kullanılır. Bu nesnenin, veritabanı işlemleri yapan her fonksiyona geçirilmesi önemlidir, böylece hepsi aynı işlemin parçası olur.

Örnek:

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 veya tx.Query kullanarak SQL sorguları çalıştırma
    return nil
}

func operation2(tx *sql.Tx) error {
    // Benzer
    return nil
}

Bu şekilde, tüm işlemler tek bir işlem kapsamında gerçekleştirilir ve hata durumunda geri alma (rollback) yapılır. Çalışma bağlamı (context.Context), iptal veya zaman aşımı için kullanılabilir, sorgu metodlarına iletilir, ancak işlem nesnesi açıkça iletilmelidir.