思路是先封装一个事务函数,内置回调方法

1 封装好的事务函数


func Transaction(f func(session *xorm.Session) error) error {
	var err error
	session := engine().NewSession()
	if err = session.Begin(); err != nil {
		log.Error("session begin failed, err msg: %s", err.Error())
		return fmt.Errorf("session begin failed")
	}
	defer func() {
		if err != nil {
			if err := session.Rollback(); err != nil {
				log.Error("session rollback failed, err msg: %s", err.Error())
			}
		} else if err = session.Commit(); err != nil {
			log.Error("session commit failed, err msg: %s", err.Error())
		}
		session.Close()
	}()
	err = f(session)
	return err
}

2 业务事务的逻辑处理


 
func TransactionExample(name ,sex,account,pwd string)  {

	//用户密码 MD5
	md5str := fmt.Sprintf("%x", md5.Sum([]byte(pwd))) 

    //进行事务操作
	err := Transaction(func(session *xorm.Session) error {
	    //先写入用户表
		userId, err := dao.UserInfoInsert(name,account, sex,session)
		if err != nil {
			return err
		} 

		//再写入注册表
		err = dao.AccountInsert(userId,name,account, sex,md5str, session)
		if err != nil {
             //返回errir ,以便事务Rollback
			return err
		}
        //返回nil,以便事务commit
		return nil
	})

	if err!=nil {
		log.Errorf("事务写入失败 :%s",err.Error())
	}

}