首页 > 解决方案 > 使用 GORM 同时保存到事务

问题描述

我正在寻找一种方法来提高事务的性能。我的代码如下所示:

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 结束:事务已提交或回滚

是否有处理多线程事务插入的正确方法?

标签: gogo-gorm

解决方案


推荐阅读