Я ищу способ улучшить производительность сделки. Мой код выглядит следующим образом:
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
}
(Это избавление от какого-то логического кода) Это, кажется, в состоянии сделать около 10 Экономит в секунду, что кажется довольно медленным, особенно при работе с большими наборами данных. Я ищу, чтобы заменить это с чем-то вдоль линии ниже:
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
}
Я в конечном итоге с SQL: сделка уже была совершена или откат
Есть правильный способ борьбы с многопоточной вставками транзакций?