Speicher gleichzeitig zu einer Transaktion mit GORM

stimmen
0

Ich bin auf der Suche nach einer Möglichkeit, die Leistung einer Transaktion zu verbessern. Mein Code sieht wie folgt aus:

return db.Transaction(func(tx *gorm.DB) error {
        for _, val := range values {
            if err := tx.Save(&val).Error; err != nil {
                fmt.Println(err)
            }
        }

        return nil
}

(Dies wird Strippen einige Logik Code entfernt) Diese etwa 10 in der Lage sein scheint zu tun Spart pro Sekunde, was ziemlich langsam vor allem scheint, wenn sie mit größeren Datensätzen handelt. Ich suche diese entlang der Linie der folgenden, mit etwas zu ersetzen:

return db.Transaction(func(tx *gorm.DB) error {
    addToDb := func(txdb *gorm.DB, job <- chan Values) {
        for val := range job {
            if err := txdb.Save(val).Error; err != nil {
                fmt.Println(err)
            }
        }
    }

    jobs := make(chan Values, len(values))

    for w := 1; w <= 10; w++ {
        go addToDb(tx, jobs)
    }

    for _, v := range values {
        jobs <- v
    }

    close(jobs)
    return nil
}

Ich am Ende mit sql: Transaktion bereits begangen worden oder zurückgerollt

Gibt es eine richtige Art und Weise mit Multi-Threaded-Transaktion Einsätzen im Umgang?

Veröffentlicht am 13/02/2020 um 21:59
quelle vom benutzer
In anderen Sprachen...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more