深圳橫崗做網(wǎng)站上海網(wǎng)站推廣優(yōu)化
-
悲觀鎖
悲觀鎖是一種悲觀思想,它認為數(shù)據(jù)很可能會被別人所修改
所以總會對數(shù)據(jù)進行上鎖,讀操作和寫操作都會上鎖,性能較低,使用較少!
-
樂觀鎖
樂觀鎖是一種樂觀思想,它認為數(shù)據(jù)并不一定會被別人所修改
所以讀操作不會上鎖,但寫操作時會先判斷當前數(shù)據(jù)是否被修改過(一般采用版本號機制來實現(xiàn) ) ?
樂觀鎖的實現(xiàn)方式:
-
在表中添加一個 version 字段,表示數(shù)據(jù)的版本
-
修改數(shù)據(jù)時首先判斷自己當前擁有的 version 和數(shù)據(jù)庫中的 version 是否一致
-
如果一致,則修改數(shù)據(jù),同時將 version 加 1,表示數(shù)據(jù)版本發(fā)生了變化
-
如果不一致,則修改失敗,表示數(shù)據(jù)被別人修改過。
步驟:
-
在實體類的字段上加上
@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;}}
-
測試
修改數(shù)據(jù)時執(zhí)行的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元,存入了數(shù)據(jù)庫p2.setPrice(p2.getPrice() - 30);result2 = productMapper.updateById(p2);System.out.println("小王修改結(jié)果:" + result2); }