1.在数据库表中添加版本控制,version字段。
2,在实体类中加入对于的字段
@Version
private Integer version;
3,注册组件
@EnableTransactionManagement
@Configuration
@MapperScan("edu.hgnu.mapper")
public class MybatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
4,测试
@SpringBootTest
public class OptimisticLockerTest {
@Autowired
private UserMapper userMapper;
@Test
public void testOp(){
//根据id查询出用户
User user = userMapper.selectById(1356474887480340482L);
user.setAge(21);
user.setName("张芳2");
user.setEmail("zhangfang@gmail.com");
//更新操作
userMapper.updateById(user);
}
@Test//演示并发问题,线程1在查询数据并更新数据user时,线程2插队查询了数据并修改,那么线程1应该时无法修改数据的。
public void testOp2(){
//线程1 根据id查询出用户
User user = userMapper.selectById(1356474887480340482L);
user.setAge(21);
user.setName("张芳2");
user.setEmail("zhangfang@gmail.com");
//线程2 横插一脚,要查询 并更新数据;
User user1 = userMapper.selectById(1356474887480340482L);
user.setAge(21);
user.setName("张芳2");
user.setEmail("zhangfang@gmail.com");
//线程2 更新操作
userMapper.updateById(user1);
//线程1 更新操作
userMapper.updateById(user);
}
}
扩展:什么时乐观锁:增加一个version字段版本控制,没次更新内容就newVersion=oldversion+1;
什么时悲观锁:任何时候,为了保证数据的正确性,都上锁。
网友评论