问题描述
情况如下:我使用了一个web接口尚且称呼为A接口,该A接口每访问一次就输出一个数据库内最新的标题,然后同时对该记录进行标记下次不输出,但是我的webfrm使用了多线程后会多次抓取到同一内容,貌似是因为页面的处理速度远没有winfrm多线程速度快,我希望在多线程的情况webapi输出的内容是唯一的,请问这个我该如何处理?我希望直接从web接口处理该问题,谢谢!
解决方案
解决方案二:
没有人帮忙吗???
解决方案三:
api的这一方法加个lock,单次只允许一个用户读、改记录。
解决方案四:
既然是服务端并发问题,那么当然必须修改服务端你的asp.net程序。在你的关键操作中,必须能够同步。例如说你的查询可以跟“同时对该记录进行标记”在一个关系数据库事务中,才能避免幻象读数据。
解决方案五:
引用2楼ajianchina的回复:
api的这一方法加个lock,单次只允许一个用户读、改记录。
请详细说说如何操作??
解决方案六:
引用3楼sp1234的回复:
既然是服务端并发问题,那么当然必须修改服务端你的asp.net程序。在你的关键操作中,必须能够同步。例如说你的查询可以跟“同时对该记录进行标记”在一个关系数据库事务中,才能避免幻象读数据。
你好能详细说一下实现方法吗?
解决方案七:
引用4楼weng12的回复:
Quote: 引用2楼ajianchina的回复:
api的这一方法加个lock,单次只允许一个用户读、改记录。请详细说说如何操作??
怎么说呢?你将API的这一方法贴上来就是了
解决方案八:
引用6楼ajianchina的回复:
Quote: 引用4楼weng12的回复:
Quote: 引用2楼ajianchina的回复:
api的这一方法加个lock,单次只允许一个用户读、改记录。请详细说说如何操作??
怎么说呢?你将API的这一方法贴上来就是了
目前代码如下:publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="text/plain";//context.Response.Write("HelloWorld");try{lock(this){stringkeywords="";stringid="";Socut.Readerdr=newSocut.Reader("SELECTTop1*FROM[Keywords]whereupdatetime<'"+DateTime.Now.ToString("yyyy-MM-dd")+"'");if(dr.Read()){keywords=dr["keywords"].ToString();id=dr["id"].ToString();Socut.Data.ExecuteNonQuery("update[[Keywords]setisbaidupc='1',updatetime='"+DateTime.Now.ToString("yyyy-MM-dd")+"'whereid="+id);}dr.Close();System.Web.HttpContext.Current.Response.Write(keywords);}}catch(Exceptionerr){//Response.Write(err.Message);}}
解决方案九:
你原来的锁改一下,lock(this)锁定的只是当前实例对象,如果有多个类实例的话,lock锁定的只是当前类实例,对该类其他实例并无影响。不过,你原先取值重复的重要原因在于你仅以日期条件来返回top1,肯定还是会出现重复的,怎么没用加上isbaidupc这个条件?privatestaticreadonlyobjectobj=newobject();publicvoidProcessRequest(HttpContextcontext){context.Response.ContentType="text/plain";//context.Response.Write("HelloWorld");try{lock(obj){stringkeywords="";stringid="";Socut.Readerdr=newSocut.Reader("SELECTTop1*FROM[Keywords]whereisbaidupc<>'1'updatetime<'"+DateTime.Now.ToString("yyyy-MM-dd")+"'");if(dr.Read()){keywords=dr["keywords"].ToString();id=dr["id"].ToString();Socut.Data.ExecuteNonQuery("update[Keywords]setisbaidupc='1',updatetime='"+DateTime.Now.ToString("yyyy-MM-dd")+"'whereid="+id);}dr.Close();System.Web.HttpContext.Current.Response.Write(keywords);}}catch(Exceptionerr){//Response.Write(err.Message);}}
解决方案十:
你是小于当前日期,那也行,我刚才写的那段里的sql语句少了个and,你还按你原来的查询吧,是试试看。
解决方案十一:
将你取数据和更新的操作写在一个数据库事务里面,因为默认的事务隔离机制,也就是数据库的锁机制,在一次事务操作结束前,下一个事务无法执行,必须等待