思路是先封装一个事务函数,内置回调方法
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())
}
}