asp.net 因多线程导致数据不唯一 有请大牛。。在线急等

weng12 2015-09-28 06:53:24
情况如下:
我使用了一个web接口 尚且称呼为A接口,该A接口每访问一次就输出一个数据库内最新的标题,然后同时对该记录进行标记下次不输出,但是我的webfrm使用了多线程后会多次抓取到同一内容,貌似是因为页面的处理速度远没有winfrm多线程速度快,我希望在多线程的情况web api输出的内容是唯一的,请问这个我该如何处理?我希望直接从web 接口处理该问题,谢谢!
...全文
187 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ajianchina 2015-09-29
  • 打赏
  • 举报
回复
你是小于当前日期,那也行,我刚才写的那段里的sql语句少了个and,你还按你原来的查询吧,是试试看。
ajianchina 2015-09-29
  • 打赏
  • 举报
回复
你原来的锁改一下,lock(this)锁定的只是当前实例对象,如果有多个类实例的话,lock锁定的只是当前类实例,对该类其他实例并无影响。 不过,你原先取值重复的重要原因在于你仅以日期条件来返回top1,肯定还是会出现重复的,怎么没用加上isbaidupc这个条件?

private static readonly object obj = new object();
public void ProcessRequest (HttpContext context)
{
	context.Response.ContentType = "text/plain";
	//context.Response.Write("Hello World");
	try
	{
		lock(obj)
		{
			string keywords="";
			string id="";
			Socut.Reader dr = new Socut.Reader("SELECT Top 1 * FROM [Keywords] where isbaidupc <> '1'  updatetime<'"+DateTime.Now.ToString("yyyy-MM-dd")+"'");
			if (dr.Read())
			{
				keywords = dr["keywords"].ToString();
				id = dr["id"].ToString();
				Socut.Data.ExecuteNonQuery("update [Keywords] set isbaidupc='1',updatetime='"+DateTime.Now.ToString("yyyy-MM-dd")+"' where id=" + id);
			}
			dr.Close();
			System.Web.HttpContext.Current.Response.Write(keywords);
		}
	}
	catch(Exception err)
	{
	//Response.Write(err.Message);
	}
}
weng12 2015-09-29
  • 打赏
  • 举报
回复
引用 6 楼 ajianchina 的回复:
[quote=引用 4 楼 weng12的回复:][quote=引用 2 楼 ajianchina 的回复:] api的这一方法加个lock,单次只允许一个用户读、改记录。
请详细说说如何操作??[/quote] 怎么说呢?你将API的这一方法贴上来就是了[/quote] 目前代码如下: public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; //context.Response.Write("Hello World"); try { lock(this) { string keywords=""; string id=""; Socut.Reader dr = new Socut.Reader("SELECT Top 1 * FROM [Keywords] where updatetime<'"+DateTime.Now.ToString("yyyy-MM-dd")+"'"); if (dr.Read()) { keywords = dr["keywords"].ToString(); id = dr["id"].ToString(); Socut.Data.ExecuteNonQuery("update [[Keywords] set isbaidupc='1',updatetime='"+DateTime.Now.ToString("yyyy-MM-dd")+"' where id=" + id); } dr.Close(); System.Web.HttpContext.Current.Response.Write(keywords); } } catch(Exception err) { //Response.Write(err.Message); } }
ajianchina 2015-09-29
  • 打赏
  • 举报
回复
引用 4 楼 weng12的回复:
[quote=引用 2 楼 ajianchina 的回复:] api的这一方法加个lock,单次只允许一个用户读、改记录。
请详细说说如何操作??[/quote] 怎么说呢?你将API的这一方法贴上来就是了
weng12 2015-09-29
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
既然是服务端并发问题,那么当然必须修改服务端你的asp.net 程序。 在你的关键操作中,必须能够同步。例如说你的查询可以跟“同时对该记录进行标记”在一个关系数据库事务中,才能避免幻象读数据。
你好能详细说一下实现方法吗?
weng12 2015-09-29
  • 打赏
  • 举报
回复
引用 2 楼 ajianchina 的回复:
api的这一方法加个lock,单次只允许一个用户读、改记录。
请详细说说如何操作??
  • 打赏
  • 举报
回复
将你取数据和更新的操作写在一个数据库事务里面,因为默认的事务隔离机制,也就是数据库的锁机制,在一次事务操作结束前,下一个事务无法执行,必须等待
  • 打赏
  • 举报
回复
既然是服务端并发问题,那么当然必须修改服务端你的asp.net 程序。 在你的关键操作中,必须能够同步。例如说你的查询可以跟“同时对该记录进行标记”在一个关系数据库事务中,才能避免幻象读数据。
ajianchina 2015-09-28
  • 打赏
  • 举报
回复
api的这一方法加个lock,单次只允许一个用户读、改记录。
weng12 2015-09-28
  • 打赏
  • 举报
回复
没有人帮忙吗???

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧