在高并发下,怎样能给每个请求返回100条不重复的记录呢?

现在有个表里有1000万条记录,需要全部读取出来执行业务一遍。(每次读取100条,每条记录只能被读取一次,查询过的记录修改State为1)

现在我用的是乐观锁,先用php从mysql读取出没执行过的最后100条记录

SELECT * FROM `list` WHERE `State` = '0' LIMIT 100

然后一条一条修改State改成1,修改成功的,则是有效可用的,否则就是被其他线程抢先修改了

UPDATE `list` SET `State` = '1'  WHERE `Id`='1' AND `State` = '0'

这样子,在并发低的情况下是挺好有的,但是在高并发下就不行了

因为同一时间查询的线程都是读取到的记录都是相同的,通过乐观锁过滤掉重复的记录后,最后每个线程剩下的可用记录就少得可怜……

解决:

直接

'UPDATE `list` SET `State` = '1'  WHERE `State` = '0' LIMIT 100;'

就获取并锁定了100条。也保证了其他进程无法再拿到这100条数据了。

咦。。等等,我们是锁定了。但是我们不知道这100条数据的id啊。看来这样行不通。

除非我们加个字段,UPDATE的时候,顺便把这100条数据打上我这个进程的标记:

'UPDATE `list` SET `State` = '1', `pid` = ' . getmypid() . '  WHERE `State` = '0' LIMIT 100;'

锁定了之后,再:

'SELECT * FROM `list` WHERE `pid` = ' . getmypid() . ' LIMIT 100'

来拿到这100条数据。处理完了再:

'UPDATE `list` SET `pid` = ' . getmypid() . '  WHERE `pid` = '0''

好了。这就实现了。但是总感觉不够优雅。

转载于:https://my.oschina.net/u/3246951/blog/850447

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值