重新撸码

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

2022-11-08  本文已影响0人  大黄蜂阿天

场景

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
}
上一篇 下一篇

猜你喜欢

热点阅读