Contemporaneamente Salvataggio in una transazione con GORM

voti
0

Sto cercando un modo per migliorare le prestazioni di una transazione. Il mio codice è simile al seguente:

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
}

(Questo è strappando via qualche codice logico) Questo sembra essere in grado di fare circa 10 salva per secondo, che sembra abbastanza lento specialmente quando si tratta di insiemi di dati di grandi dimensioni. Sto cercando di sostituire questo con qualcosa lungo la linea delle seguenti:

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
}

Io alla fine con sql: operazione sono già stati impegnati o il rollback

C'è un modo corretto di trattare con inserti di transazione multi-filettati?

È pubblicato 13/02/2020 alle 21:59
fonte dall'utente
In altre lingue...                            

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