MyBatisPlus-乐观锁
MyBatisPlus-乐观锁
为了解决业务并发现象带来的问题:秒杀。
乐观锁案例
-
数据库表中添加锁标记字段version
-
实体类中添加对应字段,并设定当前字段为逻辑删除标记字段
public class User { private Long id; @Version private Integer version; }
-
配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装
@Configuration public class MapConfig { @Bean public MybatisPlusInterceptor mpInterceptor(){ // 1. 定义Mp拦截器 MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); // 2. 添加具体的拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 3. 添加乐观锁拦截器 mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return mpInterceptor; } }
-
使用乐观锁机制在修改前必须先获取到对应数据的version方可正常进行
@Test void testUpdate(){ // User user = new User(); // user.setId(3L); // user.setName("Jock666"); // user.setVersion(1); // userDao.updateById(user); // 1. 先通过要修改的数据id将当前数据查询出来 User user = userDao.selectById(3L); // 2. 将要修改的属性逐一设置进去 user.setName("Jock888"); userDao.updateById(user); }
执行修改前先执行查询语句:
SELECT id, name, age, tel, deleted, version FROM tbl_user WHERE id=?
执行修改时使用version字段作为乐观锁检查依据
UPDATE tbl_user SET name=?, age=?, tel=?, version=? WHERE id=? AND version=?