欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql事務(wù)并發(fā)問題解決方案

 更新時間:2020年09月21日 11:31:39   作者:手撕高達的村長  
這篇文章主要介紹了Mysql事務(wù)并發(fā)問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

在開發(fā)中遇到過這樣一個問題

一個看視頻記錄,更新到100就表示看完了,后面再有請求不繼續(xù)更新了.

結(jié)果是:

導(dǎo)致,里面很多數(shù)據(jù)出現(xiàn)問題.

推測是以下的情況才會導(dǎo)致

第一條請求 事務(wù)在執(zhí)行中,還未提交(因為本地有時候比較難再現(xiàn),于是手動在程序中,第一條記錄處理的時候,sleep了幾秒,就達到這種效果了)

第二條請求 事務(wù)已經(jīng)開始執(zhí)行,這個時候查到的歷史最大值不是100,才會去進行了更新

網(wǎng)上看了一下解決方案:

悲觀鎖

直接鎖行記錄

這個我在本地測試,確實有效,一個事務(wù)開始沒結(jié)束,第二個事務(wù)一個等待,不過會導(dǎo)致處于阻塞狀態(tài),因為系統(tǒng)并發(fā),不敢考慮,也就是記錄下這個方式.

手動模擬:

執(zhí)行第一個事務(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í)行第二個事務(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;

會發(fā)現(xiàn)成功不了,一直處于等待狀態(tài).

查看鎖

確實被鎖住了,這里只要執(zhí)行第一個事務(wù)的commit ,第二個事務(wù)就會執(zhí)行.

從這里可以看出,行鎖可以直接達到理想的數(shù)據(jù)統(tǒng)一狀態(tài),一個事務(wù)修改,其他都不能操作,感覺這種比較適合銀行這種安全性的項目

樂觀鎖:

這種比較簡單,并且不會造成阻塞

方式就是加上版本號

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ù)據(jù)是否存在,如果不存在則是別其他的線程使用了.

修改為這種寫法后,使用jmeter進行多線程測試,從最開始的多條記錄更新成功,變成只有一個成功,后面的失敗.

從最開始的插入多條記錄,到后來的只能插入一條數(shù)據(jù)了

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql觸發(fā)器字段雙向更新方式

    Mysql觸發(fā)器字段雙向更新方式

    這篇文章主要介紹了Mysql觸發(fā)器字段雙向更新方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • CentOS 7下使用RPM安裝mysql5.7.13

    CentOS 7下使用RPM安裝mysql5.7.13

    這篇文章主要為大家詳細介紹了CentOS 7下使用RPM安裝mysql5.7.13的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL數(shù)據(jù)操作-DML語句的使用

    MySQL數(shù)據(jù)操作-DML語句的使用

    這篇文章主要介紹了MySQL數(shù)據(jù)操作-DML語句的使用,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • mysql如何配置secure_file_priv

    mysql如何配置secure_file_priv

    這篇文章主要介紹了mysql如何配置secure_file_priv問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mysql5.7服務(wù)無法啟動的圖文解決教程

    Mysql5.7服務(wù)無法啟動的圖文解決教程

    這篇文章主要介紹了Mysql5.7服務(wù)無法啟動問題,解決辦法非常簡單,需要的的朋友參考下
    2017-02-02
  • centos7上mysql8.0rpm方式安裝教程圖解

    centos7上mysql8.0rpm方式安裝教程圖解

    這篇文章主要介紹了centos7上mysql8.0rpm方式安裝教程,本文圖文并茂給大家介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2018-04-04
  • MySQL?count(*)統(tǒng)計總數(shù)問題匯總

    MySQL?count(*)統(tǒng)計總數(shù)問題匯總

    在日常開發(fā)工作中,我經(jīng)常會遇到需要統(tǒng)計總數(shù)的場景,比如:統(tǒng)計訂單總數(shù)、統(tǒng)計用戶總數(shù)等,這篇文章主要介紹了MySQL?count(*)統(tǒng)計總數(shù)的問題解析,需要的朋友可以參考下
    2022-09-09
  • Ubuntu16.04安裝mysql5.7.22的圖文教程

    Ubuntu16.04安裝mysql5.7.22的圖文教程

    這篇文章主要介紹了Ubuntu16.04安裝mysql5.7.22的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • windows下安裝mysql8.0.18的教程(社區(qū)版)

    windows下安裝mysql8.0.18的教程(社區(qū)版)

    本文章簡單介紹一下mysql在windows下的安裝方式,主要介紹了mysql社區(qū)版8.0.18版本,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2020-01-01
  • JDBC如何連接不同類型數(shù)據(jù)庫

    JDBC如何連接不同類型數(shù)據(jù)庫

    這篇文章主要介紹了JDBC如何連接不同類型數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2007-02-02

最新評論