更新時間:2022-09-27 10:02:33 來源:動力節點 瀏覽1803次
線程鎖分類有很多種,樂觀鎖是其中之一。樂觀鎖的實現是通過數據版本(Version)記錄機制實現的,是樂觀鎖最常用的實現方式。什么是數據版本?即為數據添加版本標識,一般是通過在數據庫中添加數字“版本”字段來實現的桌子。讀取數據時,將version字段的值一起讀取,每次更新數據時version值加一。當我們提交更新時,我們判斷數據庫表中對應記錄的當前版本信息與第一次檢索到的版本值進行比較。如果數據庫表的當前版本號等于第一次檢索到的版本值,則更新它。否則視為過期數據。
任務
共有三個字段,分別是id、value、version
(1)首先讀取task表中的數據(實際上這個表只有一條記錄),得到version的值為versionValue
(2)每次更新任務表中的value字段,為了防止沖突,需要這樣做
更新任務集 value = newValue,version = versionValue + 1
其中 version = versionValue;
只有當這條語句執行時,才表示value字段的值更新成功
例如,如果有兩個節點 A 和 B 更新任務表中的 value 字段值,大約同時,節點 A 和節點 B 從任務表中讀取的版本值是 2,那么節點 A 和節點B 正在更新 value 字段值時,更新任務集 value = newValue, version = 3 where version = 2;,其實只有 1 個節點執行 SQL 語句成功,假設 A 節點執行成功,那么 version 字段此時任務表的值為3,然后B節點操作update task set value = newValue, version = 3 where version = 2; 不執行這條SQL語句,這樣更新任務表時不會發生沖突。
/**
* 基于樂觀鎖的更新操作
* @param editFinance 編輯的賬戶對象
* @param queryLockNo 上一次查詢的樂觀鎖版本號
* @return
*/
@覆蓋
公共 int updateForLockNo (BzFinanceEntity editFinance, int queryLockNo) {
editFinance.setLockNo(queryLockNo +
1 );
//修改樂觀鎖版本
BzFinanceEntityExample 示例 =
新BzFinanceEntityExample();
BzFinanceEntityExample.Criteria 標準 = example.createCriteria();
criteria.andIdFinanceEqualTo(editFinance.getIdFinance());
criteria.andLockNoEqualTo(queryLockNo);
//基于樂觀鎖,修改查詢版本的數據
//根據Example條件更新不為null的實體BzFinanceEntity的屬性值
int mark =
this .baseEntityDao.updateByExampleSelective(editFinance, example);
返回標記;
}
以上就是關于“樂觀鎖的實現”的介紹,在本站多線程教程中還有更豐富的知識等著大家去學習,這是掌握多線程線程鎖種類的必學內容,為我們后面學習多線程的更多內容打下堅實的基礎。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習