首页 > 其他分享 >go-zero处理本地事务

go-zero处理本地事务

时间:2024-03-24 13:31:31浏览次数:21  
标签:sqlx return context err ctx zero session 本地 go

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

    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中添加代码

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.在逻辑层处理代码

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

标签:sqlx,return,context,err,ctx,zero,session,本地,go
From: https://blog.csdn.net/weixin_46124208/article/details/136986108

相关文章

  • 牛逼!本地直接部署开源、离线、免费商用的大模型知识库!快速搭建个人和企业私有智能知识
    快速上手1.环境配置首先,确保你的机器安装了Python3.8-3.11(我们强烈推荐使用Python3.11)。$python--versionPython3.11.7接着,创建一个虚拟环境,并在虚拟环境内安装项目的依赖#拉取仓库$gitclonehttps://github.com/chatchat-space/Langchain-Chatchat.g......
  • Python包的本地安装(.whl)报错:.whl is not a supported wheel on this platform
    以Pandas为例:1.报错:.whlisnotasupportedwheelonthisplatform.2.报错原因:下载的包与Python版本不相配3.解决步骤(共4步):Step1:在cmd输入命令“pipdebug--verbose”,查看可支持的版本。Step2:下载对应版本的安装包(根据......
  • Python Django框架
    1、Django简介Python下有多款不同的Web框架,Django是最有代表性的一种。许多成功的网站和APP都基于Django。Django是一个开源的Web应用框架,由Python写成。Django采用了MVC的软件设计模式,即模型M,视图V和控制器C。Django本身基于MVC架构,即Model(模型)+View(视图)+Controller(控......
  • 量化交易入门(十六)Backtrader、Zipline、PyAlgoTrade对比分析
    量化交易发展这么多年,有很多优秀的前辈为我们提供了各种开源的交易回测系统,我将对常用的Backtrader、Zipline、PyAlgoTrade这三个量化交易回测平台进行详细介绍,并进行对比分析。一、Backtrader概述:Backtrader是一个Python的事件驱动型回测框架,由社区驱动开发,功能全面且灵......
  • AntSK 0.2.3 版本更新:轻松集成 AI 本地离线模型
        大家好,今天和大家分享 AntSK知识库/智能体项目的最新进展。       AntSK是一个基于 .Net8、Blazor 及 SemanticKernel 开发的AI项目,旨在为开发者提供一个强大的AI知识库与智能体平台。最新版本的项目可以在GitHub上找到:https://github.com/A......
  • SCHTASKS命令参数 :允许管理员在本地或远程系统上创建、删除、查询、更改、运行和结束
    C:\Windows\System32\Tasks文件夹下的XML文件是用来存储Windows操作系统中计划任务的信息的。Windows操作系统通过这些XML文件来管理和存储各种预定的任务,例如定时备份、系统维护、自动更新等。这些任务可以在特定的时间或事件发生时自动执行,而XML文件则包含了这些任务的配置信......
  • Golang: 探究sync.map的实现
    Golang:探究sync.map的实现背景探究下载并发模式下,sync.map的实现,以及该实现方式可能引入的问题链接Github基本使用packagemainimport"sync"funcmain(){ m:=sync.Map{} m.Load("key") m.Store("key","value") m.LoadOrStore("key",&q......
  • Golang标准库fmt深入解析与应用技巧
    Golang标准库fmt深入解析与应用技巧前言fmt包的基本使用打印与格式化输出函数Print系列函数格式化字符串格式化输入函数小结字符串格式化基本类型的格式化输出自定义类型的格式化输出控制格式化输出的宽度和精度小结错误处理与fmt使用fmt.Errorf生成错误信息fmt包与错......
  • 深入浅出Go的`encoding/xml`库:实战开发指南
    深入浅出Go的`encoding/xml`库:实战开发指南引言基本概念XML简介Go语言中的XML处理结构体标签(StructTags)解析XML数据使用`xml.Unmarshal`解析XML结构体标签详解处理常见解析问题生成XML数据使用`xml.Marshal`生成XML使用`xml.MarshalIndent`优化XML输出自定义标签改变......
  • CF1615F LEGOndary Grandmaster
    CF1615FLEGOndaryGrandmaster计数好题,转换条件+转化贡献+组合数首先题目的操作没有什么好的性质,考虑一个经典的trick,将奇数位置上的数字取反,于是题目的操作变成\(01\rightarrow10\)或\(10\rightarrow01\)。这个操作的性质就是序列中\(1\)的总数不变,并且操作可以抽象......