MybatisPlus学习笔记------乐观锁
程序员文章站
2022-07-13 09:20:53
...
官网: MyBatis-Plus
乐观锁
乐观锁:乐观,总是认为不会出现问题,无论干什么都不会上锁!如果 出现了问题,再次更新值测试。 version、new version
悲观锁:悲观,总是认为到处都是问题,无论干什么都会上锁!
乐观锁机制
实现方式:
- 取出记录时,获取当前的version
- 更新时,带上这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
sql语句:
update user set name = 'update',version = newVersion where id = 100 and version = oldVersion
MyBatisPlus使用乐观锁
-
在数据库中添加version字段,默认值为1
-
在pojo实体类中添加version属性,并标注@version注解
@Version private Integer version;
-
注册乐观锁插件
- springboot注册
@EnableTransactionManagement @MapperScan("com.xyc.mapper") @Configuration public class MyBatisPlusConfig { //注册乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }
b. spring.xml注册
<bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>
-
测试
成功案例:(单线程)
失败案例:(模拟多线程)
//测试乐观锁 //更新成功案例 单线程 @Test public void testLock1(){ User user = userMapper.selectById(0L); user.setName("痛苦之拥"); user.setAge(14); int result = userMapper.updateById(user); } //更新失败案例 模拟多线程并发操作 @Test public void testLock2(){ //模拟第一个用户正在对一条信息进行修改,此时还没有完成修改 User user1 = userMapper.selectById(1L); user1.setName("盖伦"); user1.setAge(19); //突然出现第二个用户对该信息进行修改,并在第一个用户提交修改之前修改了该信息 User user2 = userMapper.selectById(1L); user2.setName("德玛西亚之力"); user2.setAge(18); userMapper.updateById(user2); //然后第一个用户提交了修改,如果没有加乐观锁,本次修改将会提交成功并覆盖第二个用户提交的修改 //但是在加了乐观锁之后,更新失败。因为在user1.version != version userMapper.updateById(user1); }
测试结果: