• 并发

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),否则就是两个连接,事务不起作用。