场景
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
}
网友评论