Al mismo tiempo guardar en una transacción con GORM

votos
0

Estoy buscando una manera de mejorar el rendimiento de una transacción. Mi código es el siguiente:

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
}

(Esto es el paso de lejos algo de código lógica) Esto parece ser capaz de hacer sobre 10 Guarda por segundo, lo que parece bastante lento, especialmente cuando se trata de grandes conjuntos de datos. Estoy buscando para reemplazar esto con algo a lo largo de la línea de lo siguiente:

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
}

Termino con SQL: transacción ya se ha cometido o se deshace

¿Hay una manera correcta de tratar con insertos roscados de transacciones múltiples?

Publicado el 13/02/2020 a las 23:59
fuente por usuario
En otros idiomas...                            

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