-
悲观锁
悲观锁是一种悲观思想,它认为数据很可能会被别人所修改
所以总会对数据进行上锁,读操作和写操作都会上锁,性能较低,使用较少!
-
乐观锁
乐观锁是一种乐观思想,它认为数据并不一定会被别人所修改
所以读操作不会上锁,但写操作时会先判断当前数据是否被修改过(一般采用版本号机制来实现 )
乐观锁的实现方式:
-
在表中添加一个 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); }