一开始开了 100 个 goroute,在每个 goroute 里面一条一条更新数据:
for i:=0; i<100;i++{
go func(chan){
para1 := <- chan
stmt, _ := db.Prepare("update.....")
stmt.Exec(para1)
}
}
可以做到 2 秒钟更新 1000 条。
后来改用事务来批量更新
for i:=0; i<100;i++{
go func(chan){
var paraArray []string
for para := range chan{
paraArray = append(paraArray, para)
if len(paraArray) >= 1000 {
tx, _ := db.Begin()
for _, para := range paraArray{
tx.Exec("update.....", para)
}
tx.Commit()
paraArray = paraArray[:0]
}
}
}
}
这样每个事务里面的 1000 条语句,运行时间高达 1 分钟。请问为什么用事务反而导致效率严重降低了?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.