溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫(kù)的樂觀鎖如何實(shí)現(xiàn)

發(fā)布時(shí)間:2022-09-28 09:58:54 來(lái)源:億速云 閱讀:161 作者:iii 欄目:數(shù)據(jù)庫(kù)

本文小編為大家詳細(xì)介紹“數(shù)據(jù)庫(kù)的樂觀鎖如何實(shí)現(xiàn)”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“數(shù)據(jù)庫(kù)的樂觀鎖如何實(shí)現(xiàn)”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

線程鎖分類有很多種,樂觀鎖是其中之一。樂觀鎖的實(shí)現(xiàn)是通過數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn)的,是樂觀鎖最常用的實(shí)現(xiàn)方式。什么是數(shù)據(jù)版本?即為數(shù)據(jù)添加版本標(biāo)識(shí),一般是通過在數(shù)據(jù)庫(kù)中添加數(shù)字“版本”字段來(lái)實(shí)現(xiàn)的桌子。讀取數(shù)據(jù)時(shí),將version字段的值一起讀取,每次更新數(shù)據(jù)時(shí)version值加一。當(dāng)我們提交更新時(shí),我們判斷數(shù)據(jù)庫(kù)表中對(duì)應(yīng)記錄的當(dāng)前版本信息與第一次檢索到的版本值進(jìn)行比較。如果數(shù)據(jù)庫(kù)表的當(dāng)前版本號(hào)等于第一次檢索到的版本值,則更新它。否則視為過期數(shù)據(jù)。

1.數(shù)據(jù)庫(kù)表設(shè)計(jì)

任務(wù)

共有三個(gè)字段,分別是id、value、version

2.實(shí)現(xiàn)

(1)首先讀取task表中的數(shù)據(jù)(實(shí)際上這個(gè)表只有一條記錄),得到version的值為versionValue

(2)每次更新任務(wù)表中的value字段,為了防止沖突,需要這樣做

更新任務(wù)集 value = newValue,version = versionValue + 1

其中 version = versionValue;

只有當(dāng)這條語(yǔ)句執(zhí)行時(shí),才表示value字段的值更新成功

例如,如果有兩個(gè)節(jié)點(diǎn) A 和 B 更新任務(wù)表中的 value 字段值,大約同時(shí),節(jié)點(diǎn) A 和節(jié)點(diǎn) B 從任務(wù)表中讀取的版本值是 2,那么節(jié)點(diǎn) A 和節(jié)點(diǎn)B 正在更新 value 字段值時(shí),更新任務(wù)集 value = newValue, version = 3 where version = 2;,其實(shí)只有 1 個(gè)節(jié)點(diǎn)執(zhí)行 SQL 語(yǔ)句成功,假設(shè) A 節(jié)點(diǎn)執(zhí)行成功,那么 version 字段此時(shí)任務(wù)表的值為3,然后B節(jié)點(diǎn)操作update task set value = newValue, version = 3 where version = 2; 不執(zhí)行這條SQL語(yǔ)句,這樣更新任務(wù)表時(shí)不會(huì)發(fā)生沖突。

3.項(xiàng)目中的用例

     /**
     	 * 基于樂觀鎖的更新操作
     	 * @param editFinance 編輯的賬戶對(duì)象
     	 * @param queryLockNo 上一次查詢的樂觀鎖版本號(hào)
     	 * @return    
     	 */
     @覆蓋
     公共 int  updateForLockNo (BzFinanceEntity editFinance, int queryLockNo)  {
     		editFinance.setLockNo(queryLockNo +     1 ); 
     //修改樂觀鎖版本
     		BzFinanceEntityExample 示例 =
     新BzFinanceEntityExample();
     		BzFinanceEntityExample.Criteria 標(biāo)準(zhǔn) = example.createCriteria();
     		criteria.andIdFinanceEqualTo(editFinance.getIdFinance());
     		criteria.andLockNoEqualTo(queryLockNo);     //基于樂觀鎖,修改查詢版本的數(shù)據(jù)	
     //根據(jù)Example條件更新不為null的實(shí)體BzFinanceEntity的屬性值	
     int mark = 
      this .baseEntityDao.updateByExampleSelective(editFinance, example);		
     返回標(biāo)記;
     	}

讀到這里,這篇“數(shù)據(jù)庫(kù)的樂觀鎖如何實(shí)現(xiàn)”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI