[warning!] golang defer函数里的ctx超时 会导致分布式锁或其他资源无法释放

8 篇文章 0 订阅
本文讨论了在使用分布式锁时,为何在解锁操作中应该使用`context.Background()`而不是原始的`ctx`。如果不这样做,当原始`ctx`超时时,可能导致无法执行`UnLock`,从而无法释放分布式锁,引发潜在的问题。示例代码展示了如何在服务函数`MyFunc`中正确地使用上下文来获取和释放Redis分布式锁,并在业务代码执行后确保锁能被正确解锁。
摘要由CSDN通过智能技术生成

注意:

        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
		}
	}()

    // 业务代码
    ...
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值