您好,登錄后才能下訂單哦!
這篇文章主要介紹“mysql樂(lè)觀鎖如何實(shí)現(xiàn)”,在日常操作中,相信很多人在mysql樂(lè)觀鎖如何實(shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”mysql樂(lè)觀鎖如何實(shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
在mysql中,可以利用數(shù)據(jù)版本Version記錄機(jī)制實(shí)現(xiàn)樂(lè)觀鎖,給數(shù)據(jù)表加一個(gè)version字段,每操作一次記錄的版本號(hào)加一,判斷version的值是否與剛查詢的值相等,若相等則執(zhí)行更新,若不相等則不進(jìn)行更新。
本教程操作環(huán)境:windows10系統(tǒng)、mysql8.0.22版本、Dell G3電腦。
實(shí)現(xiàn)方法
1、用數(shù)據(jù)版本Version記錄機(jī)制實(shí)現(xiàn),這是樂(lè)觀鎖最常用的一種實(shí)現(xiàn)方式。
2、數(shù)據(jù)版本,即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),一般是通過(guò)為數(shù)據(jù)庫(kù)表增加一個(gè)數(shù)字類(lèi)型的 version字段來(lái)實(shí)現(xiàn)。當(dāng)讀取數(shù)據(jù)時(shí),將version字段的值一同讀出,數(shù)據(jù)每更新一次,對(duì)此version值加1。當(dāng)我們提交更新的時(shí)候,判斷數(shù)據(jù)庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息與第一次取出來(lái)的version值進(jìn)行比對(duì),如果數(shù)據(jù)庫(kù)表當(dāng)前版本號(hào)與第一次取出來(lái)的version值相等,則予以更新,否則認(rèn)為是過(guò)期數(shù)據(jù)。
實(shí)例
update TABLE set value=2,version=version+1 where id=#{id} and version=#{version}
樂(lè)觀鎖不是數(shù)據(jù)庫(kù)自帶的,需要我們自己去實(shí)現(xiàn)。
樂(lè)觀鎖是指操作數(shù)據(jù)庫(kù)時(shí)(更新操作),想法很樂(lè)觀,認(rèn)為這次的操作不會(huì)導(dǎo)致沖突,在操作數(shù)據(jù)時(shí),并不進(jìn)行任何其他的特殊處理(也就是不加鎖),而在進(jìn)行更新后,再去判斷是否有沖突了。整體思想就是CAS思想。
通常實(shí)現(xiàn)是這樣的:在表中的數(shù)據(jù)進(jìn)行操作時(shí)(更新),先給數(shù)據(jù)表加一個(gè)版本(version)字段,每操作一次,將那條記錄的版本號(hào)加1。也就是先查詢出那條記錄,獲取出version字段,如果要對(duì)那條記錄進(jìn)行操作(更新),則先判斷此刻version的值是否與剛剛查詢出來(lái)時(shí)的version的值相等,如果相等,則說(shuō)明這段期間,沒(méi)有其他程序?qū)ζ溥M(jìn)行操作,則可以執(zhí)行更新,將version字段的值加1;如果更新時(shí)發(fā)現(xiàn)此刻的version值與剛剛獲取出來(lái)的version的值不相等,則說(shuō)明這段期間已經(jīng)有其他程序?qū)ζ溥M(jìn)行操作了,則不進(jìn)行更新操作。
eg:
下單操作包括3步驟:
1、查詢出庫(kù)存信息:
select (id,count,version) from t_goodsku where id=#{id}
2、扣減2個(gè)庫(kù)存:
程序中計(jì)算:count = count - 2;
3、更新庫(kù)存:
update t_goodsku set count={count},version=version+1 where id=#{id} and version=#{version};
第1步中查到的version其實(shí)是快照(read-commited和read-repeatable隔離機(jī)制下的MVCC機(jī)制),在這種情況下,第3步去update時(shí),獲取鎖,where條件中進(jìn)行判斷中的version=#{version},其實(shí)是拿當(dāng)前version和第1步中的快照version進(jìn)行比對(duì)
如果比對(duì)成功,說(shuō)明在這段時(shí)間內(nèi)這條數(shù)據(jù)沒(méi)有被其他線程更新過(guò),update成功;
如果對(duì)比失敗,說(shuō)明這段時(shí)間內(nèi)這條數(shù)據(jù)被更新過(guò),那么update失敗,報(bào)錯(cuò)回滾或自旋。
當(dāng)然,這里是為了模擬樂(lè)觀鎖的場(chǎng)景,實(shí)際上更新庫(kù)存時(shí)一步便可以實(shí)現(xiàn):
更新庫(kù)存:
update t_goodsku set count=count -2 where id=#{id};
到此,關(guān)于“mysql樂(lè)觀鎖如何實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。