Mysql事務(wù)并發(fā)問題解決方案
在開發(fā)中遇到過這樣一個(gè)問題
一個(gè)看視頻記錄,更新到100就表示看完了,后面再有請(qǐng)求不繼續(xù)更新了.
結(jié)果是:
導(dǎo)致,里面很多數(shù)據(jù)出現(xiàn)問題.
推測(cè)是以下的情況才會(huì)導(dǎo)致
第一條請(qǐng)求 事務(wù)在執(zhí)行中,還未提交(因?yàn)楸镜赜袝r(shí)候比較難再現(xiàn),于是手動(dòng)在程序中,第一條記錄處理的時(shí)候,sleep了幾秒,就達(dá)到這種效果了)
第二條請(qǐng)求 事務(wù)已經(jīng)開始執(zhí)行,這個(gè)時(shí)候查到的歷史最大值不是100,才會(huì)去進(jìn)行了更新
網(wǎng)上看了一下解決方案:
悲觀鎖
直接鎖行記錄
這個(gè)我在本地測(cè)試,確實(shí)有效,一個(gè)事務(wù)開始沒結(jié)束,第二個(gè)事務(wù)一個(gè)等待,不過會(huì)導(dǎo)致處于阻塞狀態(tài),因?yàn)橄到y(tǒng)并發(fā),不敢考慮,也就是記錄下這個(gè)方式.
手動(dòng)模擬:
執(zhí)行第一個(gè)事務(wù):
-- 視頻100BEGIN; SELECT * FROM `biz_coursestudyhistory` WHERE sid = 5777166; UPDATE biz_coursestudyhistory set studyStatus = 100,versionNO=versionNO+1 WHERE sid = 1 AND versionNO = 0; -- commit ; 先不執(zhí)行,先注解掉,只執(zhí)行上面的
接著執(zhí)行第二個(gè)事務(wù):
BEGIN; UPDATE biz_coursestudyhistory set studyStatus = 90,versionNO=versionNO+1 WHERE sid = 1 AND versionNO = 0; SELECT * FROM `biz_coursestudyhistory` WHERE sid = 1 FOR UPDATE; COMMIT;
會(huì)發(fā)現(xiàn)成功不了,一直處于等待狀態(tài).
查看鎖
確實(shí)被鎖住了,這里只要執(zhí)行第一個(gè)事務(wù)的commit ,第二個(gè)事務(wù)就會(huì)執(zhí)行.
從這里可以看出,行鎖可以直接達(dá)到理想的數(shù)據(jù)統(tǒng)一狀態(tài),一個(gè)事務(wù)修改,其他都不能操作,感覺這種比較適合銀行這種安全性的項(xiàng)目
樂觀鎖:
這種比較簡單,并且不會(huì)造成阻塞
方式就是加上版本號(hào)
var maxver = select max(version) from table
更新的話使用
update table set studystatus = xxx,version = version +1 where id =1 and version = maxver
寫入的話
INSERT into table (contentStudyID,courseWareID,studyStatus,studyTime,endTime) SELECT 27047358,3163,100,333,NOW() FROM dual WHERE NOT EXISTS (SELECT 1 FROM table WHERE contentStudyID =27047358 AND courseWareID = 3163 )
這種方式,可以在更新或者寫入的時(shí)候,直接判斷庫里面存在的數(shù)據(jù)是否存在,如果不存在則是別其他的線程使用了.
修改為這種寫法后,使用jmeter進(jìn)行多線程測(cè)試,從最開始的多條記錄更新成功,變成只有一個(gè)成功,后面的失敗.
從最開始的插入多條記錄,到后來的只能插入一條數(shù)據(jù)了
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql5.7服務(wù)無法啟動(dòng)的圖文解決教程
這篇文章主要介紹了Mysql5.7服務(wù)無法啟動(dòng)問題,解決辦法非常簡單,需要的的朋友參考下2017-02-02MySQL?count(*)統(tǒng)計(jì)總數(shù)問題匯總
在日常開發(fā)工作中,我經(jīng)常會(huì)遇到需要統(tǒng)計(jì)總數(shù)的場(chǎng)景,比如:統(tǒng)計(jì)訂單總數(shù)、統(tǒng)計(jì)用戶總數(shù)等,這篇文章主要介紹了MySQL?count(*)統(tǒng)計(jì)總數(shù)的問題解析,需要的朋友可以參考下2022-09-09windows下安裝mysql8.0.18的教程(社區(qū)版)
本文章簡單介紹一下mysql在windows下的安裝方式,主要介紹了mysql社區(qū)版8.0.18版本,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2020-01-01