更新時(shí)間:2022-09-27 10:02:33 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1601次
線程鎖分類有很多種,樂觀鎖是其中之一。樂觀鎖的實(shí)現(xiàn)是通過數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn)的,是樂觀鎖最常用的實(shí)現(xiàn)方式。什么是數(shù)據(jù)版本?即為數(shù)據(jù)添加版本標(biāo)識(shí),一般是通過在數(shù)據(jù)庫中添加數(shù)字“版本”字段來實(shí)現(xiàn)的桌子。讀取數(shù)據(jù)時(shí),將version字段的值一起讀取,每次更新數(shù)據(jù)時(shí)version值加一。當(dāng)我們提交更新時(shí),我們判斷數(shù)據(jù)庫表中對(duì)應(yīng)記錄的當(dāng)前版本信息與第一次檢索到的版本值進(jìn)行比較。如果數(shù)據(jù)庫表的當(dāng)前版本號(hào)等于第一次檢索到的版本值,則更新它。否則視為過期數(shù)據(jù)。
任務(wù)
共有三個(gè)字段,分別是id、value、version
(1)首先讀取task表中的數(shù)據(jù)(實(shí)際上這個(gè)表只有一條記錄),得到version的值為versionValue
(2)每次更新任務(wù)表中的value字段,為了防止沖突,需要這樣做
更新任務(wù)集 value = newValue,version = versionValue + 1
其中 version = versionValue;
只有當(dāng)這條語句執(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 語句成功,假設(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語句,這樣更新任務(wù)表時(shí)不會(huì)發(fā)生沖突。
/**
* 基于樂觀鎖的更新操作
* @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)記;
}
以上就是關(guān)于“樂觀鎖的實(shí)現(xiàn)”的介紹,在本站多線程教程中還有更豐富的知識(shí)等著大家去學(xué)習(xí),這是掌握多線程線程鎖種類的必學(xué)內(nèi)容,為我們后面學(xué)習(xí)多線程的更多內(nèi)容打下堅(jiān)實(shí)的基礎(chǔ)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743