go-zero处理本地事务

go-zero处理本地事务,
sqlx.SqlConn 提供了基础的事务机制,官方代码

go 复制代码
    var conn sqlx.SqlConn
    err := conn.TransactCtx(context.Background(), func(ctx context.Context, session sqlx.Session) error {
        r, err := session.ExecCtx(ctx, "insert into user (id, name) values (?, ?)", 1, "test")
        if err != nil {
            return err
        }
        r ,err =session.ExecCtx(ctx, "insert into user (id, name) values (?, ?)", 2, "test")
        if err != nil {
            return err
        }
    })

改造的代码

1.在生成的model文件userauthmodel.go中添加代码

go 复制代码
package user

import (
	"context"
	"github.com/zeromicro/go-zero/core/stores/sqlx"
)

var _ UserAuthModel = (*customUserAuthModel)(nil)

type (
	UserAuthModel interface {
		UserAuthModel
		withSession(session sqlx.Session) UserAuthModel
		// 添加代码1
		TransactCtx(ctx context.Context, fn func(context context.Context, session sqlx.Session) error) error
	}

	customUserAuthModel struct {
		*defaultUserAuthModel
	}
)

func NewUserAuthModel(conn sqlx.SqlConn) UserAuthModel {
	return &customUserAuthModel{
		defaultUserAuthModel: newUserAuthModel(conn),
	}
}

func (m *customUserAuthModel) withSession(session sqlx.Session) UserAuthModel {
	return NewUserAuthModel(sqlx.NewSqlConnFromSession(session))
}

// 添加代码2
func (m *customUserAuthModel) TransactCtx(ctx context.Context, fn func(ctx context.Context, session sqlx.Session) error) error {
	return m.conn.TransactCtx(ctx, func(ctx context.Context, session sqlx.Session) error {
		return fn(ctx, session)
	})

}

2.在逻辑层处理代码

go 复制代码
err := l.UserAuthModel.TransactCtx(context.Background(), func(ctx context.Context, session sqlx.Session) error {
		t := time.Now()
		// 在这里执行数据库操作
		_, err := session.Exec(`INSERT INTO _user_auth ( user_id,updated_time,created_time) 
                 VALUES (?, ?, ? )`,  11111, t, t)
		if err != nil {
			return err
		}
		_, err = session.Exec(`INSERT INTO _user_auth_log ( user_id,updated_time,created_time) 
                 VALUES (?, ?, ? )`,  11111, t, t)
		if err != nil {
			return err
		}
		if err != nil {
			return err
		}
		return nil
	})

	if err != nil {
		logx.ErrorStack("Transaction failed:", err)
	}

	return err
相关推荐
好学且牛逼的马4 分钟前
【手写Easy-Spring|1】
java·后端·spring
Grassto7 分钟前
HTTP请求超时?大数据量下的网关超时问题处理方案,流式处理,附go语言实现
后端·http·golang·go
Paul_092010 分钟前
golang编程题2
开发语言·后端·golang
代码N年归来仍是新手村成员13 分钟前
【Go】从defer关键字到锁
开发语言·后端·golang
QQ5885019818 分钟前
springboot地区特色农产品团购商城平台 小程序
spring boot·后端·小程序
毕设源码-郭学长9 小时前
【开题答辩全过程】以 基于springboot 的豪华婚车租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
Loo国昌11 小时前
深入理解 FastAPI:Python高性能API框架的完整指南
开发语言·人工智能·后端·python·langchain·fastapi
码农水水12 小时前
米哈游Java面试被问:机器学习模型的在线服务和A/B测试
java·开发语言·数据库·spring boot·后端·机器学习·word
计算机学姐13 小时前
基于SpringBoot的美食分享交流平台
java·spring boot·后端·spring·java-ee·intellij-idea·美食
源代码•宸14 小时前
Leetcode—746. 使用最小花费爬楼梯【简单】
后端·算法·leetcode·职场和发展·golang·记忆化搜索·动规