乐观锁
乐观锁实现原理:
实际上是在表中增加了一个version字段作为版本控制,version初值为1,当进行update操作时候,会先根据id查询出这一条记录,然后再进行更新操作,更新的时候判断查询出的version和当前表的version是否相同,如果相同则进行更新并且version+1,不相同则回滚。他人同时进行更新的时候,会拿自己查询出的version和表中version进行比较。如果相同则进行更新并且version+1,不相同则回滚。
写MybatisPlusConfig配置类
@EnableTransactionManagement @Configuration @MapperScan("com.atguigu.springbootmybatisplus.mapper") public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }
给表添添加一个version字段
ALTER TABLE `user` ADD COLUMN `version` INT
在实体类中标注版本控制的字段
@Version @TableField(fill = FieldFill.INSERT) private Integer version;
设置插入时自动填充version = 1
测试乐观锁成功的情况
/** * 测试乐观锁成功的情况 */ @Test void testOptimisticLocker(){ User user = userMapper.selectById(1654374884886777857L); System.out.println(user); user.setName("xiaozhao"); //user.setVersion(user.getVersion()-1); userMapper.updateById(user); }
测试模拟并发时已经修改的数据
/** * 测试乐观锁成功的情况 */ @Test void testOptimisticLocker(){ User user = userMapper.selectById(1654374884886777857L); System.out.println(user); user.setName("xiaozhao"); user.setVersion(user.getVersion()-1); userMapper.updateById(user); }