Одновременное сохранение транзакции с GORM - PullRequest
0 голосов
/ 13 февраля 2020

Я ищу способ повысить производительность транзакции. Мой код выглядит следующим образом:

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
}

(это убирает некоторый логический c код). Кажется, что он способен делать около 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: транзакция уже зафиксирована или откатана

Есть ли правильный способ работы с многопоточными вставками транзакций?

...