樂觀鎖
在編程過程中,我們經常會被問到樂觀鎖,悲觀鎖,都非常簡單
樂觀鎖:顧名思義,思想十分樂觀,總是認為不會出現問題,無論什么都不去上鎖!如果出現了問題,就再更新測試
悲觀鎖:顧明思義,思想十分悲觀,總是認為總會出現問題,無論什么都去上鎖!再去操作
我們主要來講一下樂觀鎖機會
官網的解釋是這樣的
樂觀鎖:
1. 先查詢,獲取版本號version = 1;
A--線程
update air set name = "chougoushi", version = version + i
where id = 2 and version = 1
B--線程如果搶先完成,這個時候version = 2, 會導致A修改失敗
update air set name = "chougoushi", version = version + i
where id = 2 and version = 1
測試一下MP(MybatisPLus)
首先給實體類的表添加一個字段
version

給實體類添加屬性
version,添加@Version注解
創建一個樂觀鎖的配置類
測試樂觀鎖
//測試樂觀鎖成功
@Test
public void testOptimisticlocker(){
//1.查詢用戶信息
Air air = airMapper.selectById(1L);
//2.修改用戶信息
air.setPm25(44);
air.setPm10(899);
//3.執行更新操作
airMapper.updateById(air);
}


測試失敗的樂觀鎖
//測試樂觀鎖失敗
@Test
public void testOptimisticlocker2(){
//線程1
//1.查詢用戶信息
Air air1 = airMapper.selectById(1L);
//2.修改用戶信息
air1.setPm25(999);
air1.setPm10(1000);
//模擬另一個線程執行了插隊操作
//1.查詢用戶信息
Air air2 = airMapper.selectById(1L);
//2.修改用戶信息
air2.setPm25(4555);
air2.setPm10(6666);
//3.執行更新操作
airMapper.updateById(air2);
airMapper.updateById(air1);
}
先來看結果
再看對應的sql分析一波





