Golang 的mysql 事务优雅的实现

本文介绍了一个用Go语言实现的事务处理方法,通过封装事务函数来确保数据库操作的原子性。具体示例展示了如何使用该方法完成用户信息和注册记录的同时写入,包括错误处理和回滚机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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())
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值