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)雅。
添加回答
舉報
0/150
提交
取消