redsync的使用问题

redsync的使用问题

集成之后如果库存不足系统也会强行报错
图片描述

相关代码:

func (s *Service) Sell(ctx context.Context, request *inventorypb.SellInfoRequest) (*emptypb.Empty, error) {
	tx := s.DB.Begin()
	for _, goodsInfo := range request.GoodsInfo {

		mutex := s.RedSync.NewMutex(fmt.Sprintf("inv_%d", goodsInfo.GoodsId))
		if err := mutex.Lock(); err != nil {
			s.Logger.Error("can not get redis lock", zap.Error(err))
			return nil, status.Error(codes.Internal, "")
		}

		var inv model.Inventory
		res := s.DB.Where(&model.Inventory{GoodsID: goodsInfo.GoodsId}).First(&inv)
		if res.Error != nil {
			s.Logger.Error("can not get inv", zap.Error(res.Error))
			return nil, status.Error(codes.Internal, "")
		}
		if res.RowsAffected == 0 {
			// 没有该商品的库存信息
			tx.Rollback()
			return nil, status.Error(codes.NotFound, "")
		}
		if inv.Stocks < goodsInfo.Num {
			// 现有库存小于购买数量
			tx.Rollback()
			return nil, status.Error(codes.ResourceExhausted, "")
		}
		// 数据库真实扣减小于预期扣减,超卖问题
		inv.Stocks -= goodsInfo.Num
		tx.Save(&inv)

		if ok, err := mutex.Unlock(); !ok || err != nil {
			s.Logger.Error("redis can not unlock")
			return nil, status.Error(codes.Internal, "")
		}
	}
	tx.Commit()

	return &emptypb.Empty{}, nil
}
func TestConcurrentSell(t *testing.T)  {
	client := initClient()

	var wg sync.WaitGroup
	for i := 0; i < 20; i ++ {
		wg.Add(1)
		go func() {
			_, err := client.Sell(context.Background(), &inventorypb.SellInfoRequest{
				GoodsInfo: []*inventorypb.GoodsInvInfoRequest{
					{
						GoodsId: 421,
						Num: 1,
					},
				},
			})
			if err != nil {
				t.Error(err)
			}
			wg.Done()
		}()
	}
	wg.Wait()
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
bobby 2021-04-23 00:13:51

http://img1.sycdn.imooc.com//climg/6081a07c09f131f512410367.jpg从你的描述来看是这一行报错了,那这一行报错只提到了无法获取锁,没有更加具体的原因,有没有debug进入源码看看具体是在redsync的哪一行代码报错了?看看有没有更加具体的错误原因没有抛出来

  • 提问者 飘渺的心意 #1

    我明白了应该是出错也要unlock不然其他人拿不到锁

    http://img1.sycdn.imooc.com//climg/60822c2309c35fb623901302.jpg

    http://img1.sycdn.imooc.com//climg/60822c250999c5e323901302.jpg


    2021-04-23 10:09:40
  • bobby 回复 提问者 飘渺的心意 #2

    好的。。。。

    2021-04-23 20:24:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师