一,乐观锁&悲观锁
乐观锁: 顾名思义十分乐观,他总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新值测试
悲观锁;顾名思义十分悲观,他总是认为出现问题,无论干什么都会上锁!再去操作!
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时,set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
二,测试
1,数据库添加version字段并默认值为1 (实体类也需要同步)
二,创建配置类
package com.demo.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@MapperScan("com.demo.mapper")
//自动管理事务
@EnableTransactionManagement
@Configuration
//配置类
public class MyBatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
return new OptimisticLockerInterceptor();
}
}
3,编写测试
代码(成功)
//测试成功
@Test
void optimisticLockerText(){
User user = mapper.selectById(1L);
user.setName("zhangsan");
user.setAge(28);
int i = mapper.updateById(user);
System.out.println(i);
}
数据库
代码(失败)
//测试失败
@Test
void optimisticLockerText2(){
//线程1
User user = mapper.selectById(2L);
user.setName("zhangsan11");
user.setAge(25);
//线程插队
User user2 = mapper.selectById(2L);
user.setName("zhangsan22");
user.setAge(30);
int i = mapper.updateById(user);//如果没有乐观锁就会覆盖
System.out.println(i);
}