关于foreach(DataRow)的问题

ling7xin 2018-03-17 10:56:24
有两个表A,B
现在需要把表A的某个字段读取出来,经过处理后更新到表B
但是由于表A的数据量比较大
导致执行过程需要一定的时间,
我用的foreach(DataRow)
处理过程中一旦有人再次调用这个方法,就会导致表B被多次更新
public void fangfa(){
select * from [A] where num>0
foreach(DataRow dr in dt.rows){ //这里的数据量比较大
int num=dr["num"]+1;
update [B] set num=num+"+num+" where aid=A.id
}
}
这个方法可能会被两个工作人员同时执行,所以导致第一个人还没执行完成的时候第二个人也在执行,那么B表就会增加双倍的num
有没有大神提供一下思路解决这个问题
...全文
852 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
如果要我简单抓重点来说,真正的重点是:专门学过数据库入门课程(而不是什么c#编程课程)。
  • 打赏
  • 举报
回复
1. 不能乱写“select *”,你只是要获得 num 的值,那么就应该明确写“select num”,不要乱写“select *”。 2. 正规去学习 sql 课程。查询数据库要一次读取统计结果 sum(num)。不可以把一大堆垃圾数据序列化到内存里边。 3. 轻量化地 ADO.NET 访问数据库,读取一个结果值,使用 ExecuteScalar 语句,不要用什么 DataTable、DataRow 这类东西。刚学编程时这样抄袭是可以理解的,但是这只是刚学编程时抄袭。使用 DataTable 就好像用50年前的大炮打今天的无人侦察机,纯粹是多余的做法。 4. 如果只是一个进程中互斥,可以使用 lock 语句块来同步各个线程,使得同一时间只有一个线程进入此语句块,从而避免多线程并发处理时结果混乱。当然 lock 语句块越小越好,越小性能越好。 5. 关系数据库系统使用“数据库事务”来保证数据一致性,避免幻像读问题。这个也是要学习关系数据库课程、sql 课程才能理解。在 ado.net 编程中要显式使用 DbConnection.CreateTransaction 语句来创建事务。当然重点还是在于背后的知识真正花时间学过,而不仅仅是抄编程语言。
lovebaby 2018-03-18
  • 打赏
  • 举报
回复
SoulRed 2018-03-18
  • 打赏
  • 举报
回复
让我想起了mssql的主从数据库设计,一个只读库,一个可写库,不但增加了效率还解决了你遇到的问题。 或者用锁排斥其他的人在同一段时间内操作数据库。 方法很多
qq_38964212 2018-03-18
  • 打赏
  • 举报
回复
lock(this){ --代码块 }
圣殿骑士18 2018-03-18
  • 打赏
  • 举报
回复
其实这是个业务问题,本来就不应该出现A和B同时执行这个方法的情况。否则就算使用了行锁,也会导致1行被A更新之后,很快又被B更新的问题,因为A更新·1行的动作已经在之前完成。 实际上,你应该是控制A的执行时间区间和B的时间区间完全不应该重复。所以加个数据库标记即可,A同步前写入标记1,B要同步时发现值为1,就不能同步。A同步完将标记改回0

62,046

社区成员

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

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

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

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