亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在高并發下,怎樣能給每個請求返回100條不重復的記錄呢?

在高并發下,怎樣能給每個請求返回100條不重復的記錄呢?

翻閱古今 2019-02-19 20:17:09
mysql初學者,有個問題請教各位老師 現在有個表里有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' 這樣子,在并發低的情況下是挺好有的,但是在高并發下就不行了 因為同一時間查詢的線程都是讀取到的記錄都是相同的,通過樂觀鎖過濾掉重復的記錄后,最后每個線程剩下的可用記錄就少得可憐…… 請問各位老師,怎樣能在高并發訪問的情況下,怎樣能給每個請求返回100條不重復的記錄呢?(不一定能全返回100條,盡可能多就行)
查看完整描述

2 回答

?
慕村225694

TA貢獻1880條經驗 獲得超4個贊

首先贊一下樓主。這是個很好的樂觀鎖應用場景。很好的提問。感謝!

直接

'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''

好了。這就實現了。但是總感覺不夠優雅。

查看完整回答
反對 回復 2019-03-01
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

如果每次先從Redis里拿上次的最大id,不就可以了,所有線程訪問同一個Redis,然后where id > redis獲取的值

查看完整回答
反對 回復 2019-03-01
  • 2 回答
  • 0 關注
  • 865 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號