注意:
UnLock的ctx要使用context.Background()
如果UnLock依旧使用原ctx,可能会因为原ctx超时会导致UnLock无法执行,进而导致分布式锁无法释放
代码:
func (s *MyService) MyFunc(ctx context.Context) (err error) {
// redis lock
if err = s.dao.LockWithExp(ctx, model.GetMyKeyRedisLock(), time.Duration(2)*time.Second); err != nil {
if err == ECode.RedisLockAlreadyExistsError {
err = ECode.FrequentlyError
return
}
log.Errorc(ctx, "[service] MyFunc dao.Lock return err: %v", err)
return
}
// redis unLock【注意:UnLock的ctx要使用context.Background()】
defer func() {
if unLockErr := s.dao.UnLock(context.Background(), model.GetMyKeyRedisLock()); unLockErr != nil {
log.Errorc(ctx, "[service] MyFunc dao.UnLock return unLockErr: %v", unLockErr)
err = ECode.FrequentlyError
}
}()
// 业务代码
...
}