佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Mysql事務(wù)并發(fā)問題解決方案

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

熱門標(biāo)簽:鐵路電話系統(tǒng) 百度競(jìng)價(jià)排名 呼叫中心市場(chǎng)需求 AI電銷 網(wǎng)站排名優(yōu)化 地方門戶網(wǎng)站 服務(wù)外包 Linux服務(wù)器

在開發(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)目

樂觀鎖:

這種比較簡(jiǎn)單,并且不會(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í)候,直接判斷庫(kù)里面存在的數(shù)據(jù)是否存在,如果不存在則是別其他的線程使用了.

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

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

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

您可能感興趣的文章:
  • MySQL系列之十 MySQL事務(wù)隔離實(shí)現(xiàn)并發(fā)控制
  • 詳解MySQL多版本并發(fā)控制機(jī)制(MVCC)源碼
  • mysql的MVCC多版本并發(fā)控制的實(shí)現(xiàn)
  • MySQL高并發(fā)生成唯一訂單號(hào)的方法實(shí)現(xiàn)
  • MySQL 加鎖控制并發(fā)的方法
  • MySQL 數(shù)據(jù)庫(kù)如何解決高并發(fā)問題
  • mysql并發(fā)控制原理知識(shí)點(diǎn)
  • mysql多版本并發(fā)控制MVCC的實(shí)現(xiàn)
  • MySQL并發(fā)更新數(shù)據(jù)時(shí)的處理方法
  • Tomcat+Mysql高并發(fā)配置優(yōu)化講解
  • MySQL 到底是如何做到多版本并發(fā)的?

標(biāo)簽:蘭州 仙桃 湖南 湘潭 黃山 衡水 崇左 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql事務(wù)并發(fā)問題解決方案》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    巍山| 衡阳市| 根河市| 清丰县| 新田县| 凌海市| 拉孜县| 荆州市| 扶绥县| 桐乡市| 曲松县| 锦州市| 庆云县| 安顺市| 黄骅市| 宁德市| 新田县| 襄垣县| 余姚市| 安顺市| 察雅县| 夹江县| 习水县| 汉源县| 泸溪县| 文水县| 祁连县| 夹江县| 莆田市| 保德县| 兰考县| 文水县| 新兴县| 平阴县| 奈曼旗| 桐梓县| 临江市| 攀枝花市| 启东市| 海盐县| 阿拉善右旗|