-
并发
sync.WaitGroupsync.WaitGroup
(wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()
var wg sync.WaitGroup
wg.Add(1) // 启动一个goroutine就登记+1
go doDir() //自定义函数处理业务逻辑
wg.Wait() // 等待所有登记的goroutine都结束
func doDir(){
defer wg.Done() //goroutine结束就登记-1
}
goroutinegoroutine
goroutine中最主要的是三个实体为GMP:
GPM(machine)
sync.WaitGroup
- 事务
func execTransaction(db *sql.DB) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer func() {
if err != nil {
tx.Rollback()
return
}
}()
err = execSql(tx) //sql执行处理
if err != nil {
return err
}
return tx.Commit()
}
func execSql(tx *sql.Tx){
var sqlCmd = fmt.Sprintf("insert into table values(...)")
tx.Exec(sql)
}
注意 tx.Exec(sql) 而不是db.Exec(sql),否则就是两个连接,事务不起作用。