場(chǎng)景
mysql innodb 存儲(chǔ)引擎在業(yè)務(wù)需要滿足事務(wù)的一些情況
具體代碼
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 事務(wù)就會(huì)失敗
l.svcCtx.Trans(func(session sqlx.Session) error {
// step 1
// step 2
// ...
// step n
return nil
}