GO语言defer与锁配合使用的小技巧:
在使用redsync(红锁)或其他任何锁之类的东西时,可以将其整段代码包含在 func(){}() 里面
好处在于:
1.如果需要锁定的代码并没有直到函数结束,则不需要浪费锁定的时间,用到哪锁到哪
2.如果不用这种方法,又不想浪费锁定时间,就需要在每个return前手动释放一次锁,很麻烦,可读性也差
示例如下:
// // //其他正常代码 // // func() { mutexname := fmt.Sprintf("erp_stock-mutex:%d", req.SkuId) mutex := global.Rs.NewMutex(mutexname) if err := mutex.Lock(); err != nil { zap.S().Infof("获取锁失败:%+v", err) global.Error(c, "服务器繁忙,设置失败") } defer mutex.Unlock() //关键在于此 var sku model.Sku if result := global.Db.Model(&model.Sku{}).Where(&model.Sku{ ID: req.SkuId, }).First(&sku); result.RowsAffected == 0 { global.Error(c, "规格不存在") return } *sku.Stock -= *req.Nums *sku.Sale += *req.Nums if result := global.Db.Save(&sku); result.RowsAffected == 0 { global.Error(c, "设置库存失败") return } }() // // //其他正常代码 // //
发表评论