问题描述
publicstaticobjecto=newobject();//属性lock(o){try{if(!string.IsNullOrEmpty(context.Request.Params["ext4"])){av.Age=int.Parse(context.Request.Params["ext4"]);}av.ParentTel=context.Request.Params["ext6"];av.Votes=0;av.PlayerNum=App_VoteInfo.GetMax(ac.VoteId)+1;//获得最大的编号,并加1av.Audited=ac.AutoAudit;av.Description=context.Request.Form["ext10"];av.CreateDate=DateTime.Now;av.PicUrl1=MakePic(context.Request.Form["ext7"],context,ac);av.PicUrl2=MakePic(context.Request.Form["ext8"],context,ac);av.PicUrl3=MakePic(context.Request.Form["ext9"],context,ac);if(string.IsNullOrEmpty(av.PicUrl1)&&string.IsNullOrEmpty(av.PicUrl2)&&string.IsNullOrEmpty(av.PicUrl3)){thrownewException("没有照片");}if(ac.BaoMingGuanZhu){av.OpenId=context.Request.Cookies["openid"].Value;}av.Save();}catch(Exceptionex){//LogManager.getInstance().getLogger(this.GetType()).Error(ex);error=true;}}
照理不会重复,编号只会越来越大,实际上操作,仍然有少量重复的。怎么回事。
解决方案
解决方案二:
publicstaticobjecto=newobject();//属性这句话是在类里做为属性声明并实例化的。不是在方法体里临时实例化的。
解决方案三:
App_VoteInfo.GetMax(ac.VoteId)+1;锁地方放错了,应放GetMax里。还有ac.Voteld是啥为毛参数传进去。。
解决方案四:
缺乏上下文,没法判断
解决方案五:
引用2楼wyd1520的回复:
App_VoteInfo.GetMax(ac.VoteId)+1;锁地方放错了,应放GetMax里。还有ac.Voteld是啥为毛参数传进去。。
就是取这个最大活动的最大id啊,ac.Voteld是活动的id
解决方案六:
根据你的描述,是不能分析出如何设计程序的。因为你不愿意说明主要的程序机制。正如#2所说,如果你只是空洞地讲一下App_VoteInfo.GetMax(ac.VoteId)的概念,是不能分析出为什么它查询出错的。并且因为这个毛病,其实你也可能已经滥用了lock,在过大的范围使用lock。这会严重影响程序并发处理的效率。
解决方案七:
这静态变量放错地方了吧,应该放入Application
解决方案八:
解决方案九:
publicstaticintGetMax(intvoteid){Queryq=App_VotePlayer.CreateQuery();q.AddWhere(App_VotePlayer.Columns.VoteId,voteid);objecto=q.GetMax(App_VotePlayer.Columns.PlayerNum);if(o==null){return0;}elseif(o.ToString()==""){return0;}else{returnint.Parse(o.ToString());}}
以上是App_VoteInfo.GetMax的方法体
解决方案十:
解决方案十一:
av是什么gui?跟App_VotePlayer有什么关系?保存av后,在那里更新max?
解决方案十二:
如是max在别的地方更新,那就可能存在你说的重复问题
解决方案十三:
你将锁的范围缩小到只锁必要的部分看看呢还有你确认你这个新增只有这一个入口,是否还存在其它代码也在执行Insert操作if(ac.BaoMingGuanZhu){av.OpenId=context.Request.Cookies["openid"].Value;}lock(o){av.PlayerNum=App_VoteInfo.GetMax(ac.VoteId)+1;//获得最大的编号,并加1av.Save();}