高并发select的问题

wyswlp 2013-06-07 08:43:02
各位大神,最近接手改造一个原生jdbc的java项目,把一张表里的记录按顺序拿出来去做操作,操作之后更新标志位,接着读取下一条,开一两个进程还可以,同时并发40个操作就出问题了,有1/4的进程读取的是同一条记录,select.....for update加锁了,加锁只是避免了更新,但是避免不了读取,有10个进程同时读取一条记录,1个锁行,另外9个还会等待,这个时间老板还是接受不了......
最期望的是40个并发能够顺序的沿着表向下读,而不用等锁,求各位大神指点啊!!急求!!
...全文
480 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyswlp 2013-06-19
  • 打赏
  • 举报
回复
结贴!分区+批量,批量不会太影响效率,4楼大神正中要点~~
oh_Maxy 2013-06-18
  • 打赏
  • 举报
回复
LZ可以考虑下9L的方法
MasterWilliam 2013-06-18
  • 打赏
  • 举报
回复
学习了!受教了!!!!!!好样的!
jiwangli369 2013-06-17
  • 打赏
  • 举报
回复
跟select没关系吧? 建议如下: 1、数据表做分区 2、数据库做读写分离
wyswlp 2013-06-13
  • 打赏
  • 举报
回复
谢各位大神指点~~最终决定用批量加分区的方式解决,集合4楼和10楼的大神指导~~今日修改,明日结贴~
PresleyK 2013-06-13
  • 打赏
  • 举报
回复
表中有没有唯一的标识? 如果有序列最好了,你可以启10个进程,第1个进程取所有标识尾数为1的,第10个进程取所有标识尾数为0的,...以此类推,或者取摩运算. 总之让你的进程不会同时取同一条记录.
商科程序员 2013-06-13
  • 打赏
  • 举报
回复
可以分布,一个线程去查记录,40个线程处理记录。这样不会有问题。
随风818 2013-06-13
  • 打赏
  • 举报
回复
我也认为不应该在数据库层面做 你可以考虑分批读数据到Java 安全队列中处理 这样就不会多个线程同时处理同一条数据了
gu390154333 2013-06-08
  • 打赏
  • 举报
回复
for update 悲观锁,这不会阻塞读,只能阻塞写 如果你一定要按顺序执行,我和你说了,不要在数据库层面考虑锁,在程序层面同步,数据你采用批量方式,不能逐行更新,这样保证了你数据不可能重复读,性能也不会太低
wyswlp 2013-06-08
  • 打赏
  • 举报
回复
希望大神们继续指点啊,我的理解update加锁并不能阻止别的并发去读取同一条记录,测试之后发现update加锁若并发去读取,还是会读到同一条记录,只是无法更新,若等待解锁,有可能下次这个进程还是抢占不到。能不能做到一个进程读取一条数据,下一个并发的进程就不会读该数据。
wyswlp 2013-06-08
  • 打赏
  • 举报
回复
引用 5 楼 zt_soft 的回复:
1, 能不能把处理逻辑放在store procedure去处理 2, 循环里面批量更新 3, 不要用悲观锁, 对oracle来说读是不阻塞更新的,sqlserver以前版本是有这情况,现在不清楚。
这个用的mysql,有200万左右的数据需要处理,读出来去网上查,然后分析,市场部门的一个遗留项目。你说的是把哪一部分逻辑放在过程里呢
wyswlp 2013-06-08
  • 打赏
  • 举报
回复
引用 4 楼 gu390154333 的回复:
for update 悲观锁,这不会阻塞读,只能阻塞写 如果你一定要按顺序执行,我和你说了,不要在数据库层面考虑锁,在程序层面同步,数据你采用批量方式,不能逐行更新,这样保证了你数据不可能重复读,性能也不会太低
批量更新读数据库的时候怎么保证不被同时读大神 ,求细说。批量更新1000条时候还是可能并发读取呀。
zt_soft 2013-06-08
  • 打赏
  • 举报
回复
1, 能不能把处理逻辑放在store procedure去处理 2, 循环里面批量更新 3, 不要用悲观锁, 对oracle来说读是不阻塞更新的,sqlserver以前版本是有这情况,现在不清楚。
gu390154333 2013-06-07
  • 打赏
  • 举报
回复
采取批量更新,1000条一次 批量更新的方法同步,不考虑数据层面锁
撸大湿 2013-06-07
  • 打赏
  • 举报
回复
这个和Select有什么关系? 锁的不是Select,而是Update。 如果没理解错,LZ每次Select后都会去Update原表 除非你用了排它锁,更新锁不会阻止SELECT,在大并发的情况下,后面的Update才会被锁。 这种情况只有改变业务结构,Select之后不要立刻Update,而是Insert状态到一张Log表。 Log表的数据异步更新原表的数据

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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