-
悲觀鎖
悲觀鎖是一種悲觀思想,它認為數據很可能會被別人所修改
所以總會對數據進行上鎖,讀操作和寫操作都會上鎖,性能較低,使用較少!
-
樂觀鎖
樂觀鎖是一種樂觀思想,它認為數據并不一定會被別人所修改
所以讀操作不會上鎖,但寫操作時會先判斷當前數據是否被修改過(一般采用版本號機制來實現 ) ?
樂觀鎖的實現方式:
-
在表中添加一個 version 字段,表示數據的版本
-
修改數據時首先判斷自己當前擁有的 version 和數據庫中的 version 是否一致
-
如果一致,則修改數據,同時將 version 加 1,表示數據版本發生了變化
-
如果不一致,則修改失敗,表示數據被別人修改過。
步驟:
-
在實體類的字段上加上
@Version
注解@Version // 樂觀鎖注解 private Integer version;
-
配置MybatisPlusConfig
@Configuration @MapperScan("net.wanho.mapper") public class MyBatisPlusConfig {/*** 攔截器*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 樂觀鎖插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}
-
測試
修改數據時執行的sql語句:
UPDATE product SET name=?, price=?, version=? WHERE id=? AND version=?
-
修改的條件中,對 version 做了判斷,只有和當前擁有的 version 一致才進行修改
-
修改的字段中,對 version 做了+1
-
-
判斷是否修改失敗
如果修改失敗,重新獲取商品信息,再次修改
if (result2 == 0) {// 5.小王修改失敗,重新獲取商品信息p2 = productMapper.selectById(1);// 6.小王將商品減了30元,存入了數據庫p2.setPrice(p2.getPrice() - 30);result2 = productMapper.updateById(p2);System.out.println("小王修改結果:" + result2); }