go-zero处理本地事务

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

相关推荐

  1. go-zero处理本地事务

    2024-03-25 09:28:01       33 阅读
  2. go-zero

    2024-03-25 09:28:01       62 阅读
  3. go-zero 全局异常处理-全局中间件

    2024-03-25 09:28:01       50 阅读
  4. go-zero接口签名

    2024-03-25 09:28:01       64 阅读
  5. go-zero 开发之安装 etcd

    2024-03-25 09:28:01       62 阅读
  6. go-zero目录结构和说明

    2024-03-25 09:28:01       64 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 09:28:01       99 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 09:28:01       107 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 09:28:01       90 阅读
  4. Python语言-面向对象

    2024-03-25 09:28:01       98 阅读

热门阅读

  1. Spark与hive 不兼容语法

    2024-03-25 09:28:01       50 阅读
  2. 如何在MySQL中实现基于时间点的恢复?

    2024-03-25 09:28:01       39 阅读
  3. 01背包问题dp

    2024-03-25 09:28:01       44 阅读
  4. 请说明Vue父组件向子组件传值的方法

    2024-03-25 09:28:01       40 阅读
  5. import * as的使用

    2024-03-25 09:28:01       37 阅读
  6. Python BaseModel和dataclass用法和区别

    2024-03-25 09:28:01       37 阅读
  7. 开源GPGPU

    2024-03-25 09:28:01       37 阅读
  8. 前端并发控制

    2024-03-25 09:28:01       39 阅读
  9. 前端开发中手机端相关知识点

    2024-03-25 09:28:01       32 阅读