go-zero 数据库事务处理callback封装(单机)

场景

mysql innodb 存储引擎在业务需要满足事务的一些情况

具体代码

func (context *ServiceContext) Trans(fn func(session sqlx.Session) error) error {

    return context.Mysql.Transact(func(session sqlx.Session) error {
        return fn(session)
    })

}

具体使用

# 需要做兼容处理
func (m *defaultRoleModel) Insert(ctx context.Context, data *Role, session sqlx.Session) (sql.Result, error) {
    iotRoleIdKey := fmt.Sprintf("%s%v", cacheIotRoleIdPrefix, data.Id)
    ret, err := m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
        query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?)", m.table, roleRowsExpectAutoSet)
        if session != nil {
            return session.ExecCtx(ctx, query, data.Id, data.Pid, data.Name, data.Remarks, data.Sort, data.DeleteTime)
        }
        return conn.ExecCtx(ctx, query, data.Id, data.Pid, data.Name, data.Remarks, data.Sort, data.DeleteTime)
    }, iotRoleIdKey)
    return ret, err
}

// callback中只要return err 事务就会失败
l.svcCtx.Trans(func(session sqlx.Session) error {
    // step 1
    // step 2
    // ...
    // step n
     return nil
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。