第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

翻閱古今 2019-02-19 20:17:09
mysql初學者,有個問題請教各位老師 現(xiàn)在有個表里有1000萬條記錄,需要全部讀取出來執(zhí)行業(yè)務(wù)一遍。(每次讀取100條,每條記錄只能被讀取一次,查詢過的記錄修改State為1) 現(xiàn)在我用的是樂觀鎖,先用php從mysql讀取出沒執(zhí)行過的最后100條記錄 SELECT * FROM `list` WHERE `State` = '0' LIMIT 100 然后一條一條修改State改成1,修改成功的,則是有效可用的,否則就是被其他線程搶先修改了 UPDATE `list` SET `State` = '1' WHERE `Id`='1' AND `State` = '0' 這樣子,在并發(fā)低的情況下是挺好有的,但是在高并發(fā)下就不行了 因為同一時間查詢的線程都是讀取到的記錄都是相同的,通過樂觀鎖過濾掉重復(fù)的記錄后,最后每個線程剩下的可用記錄就少得可憐…… 請問各位老師,怎樣能在高并發(fā)訪問的情況下,怎樣能給每個請求返回100條不重復(fù)的記錄呢?(不一定能全返回100條,盡可能多就行)
查看完整描述

2 回答

?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

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

直接

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

就獲取并鎖定了100條。也保證了其他進程無法再拿到這100條數(shù)據(jù)了。

咦。。等等,我們是鎖定了。但是我們不知道這100條數(shù)據(jù)的id啊??磥磉@樣行不通。

除非我們加個字段,UPDATE的時候,順便把這100條數(shù)據(jù)打上我這個進程的標記:

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

鎖定了之后,再:

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

來拿到這100條數(shù)據(jù)。處理完了再:

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

好了。這就實現(xiàn)了。但是總感覺不夠優(yōu)雅。

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

TA貢獻1712條經(jīng)驗 獲得超3個贊

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

查看完整回答
反對 回復(fù) 2019-03-01
  • 2 回答
  • 0 關(guān)注
  • 863 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號