go - 使用 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 结束:事务已提交或回滚
是否有处理多线程事务插入的正确方法?
解决方案
推荐阅读
- c# - 如何将 Linq select new 转换为 DataTable
- angular - Stimulsoft - How to render report in asp.net core and show it in angular
- node.js - 如何计算用户对特定帖子的浏览量?只计算每个用户一次
- javascript - Angular 7 项目的 Esri 代理截图
- mysql - RDS - 超过 1205 锁定等待超时尝试重新启动事务
- regex - 如何在 linux shell 中使用 sed 选择内容
- c - 我尝试创建以相反顺序显示其给定参数的代码,但为什么它的代码告诉我分段错误?
- sql - TSQL Outer JOIN:SELECT 附近的语法不正确
- mysql - 表DB自动填充
- geoip - Matomo 中的 GeoIP,之前的 Piwik 地图东京区