CREATE TABLE t_product
(
id BIGINT(20) NOT NULL COMMENT '主键id',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
price INT(11) DEFAULT 0 COMMENT '价格',
VERSION INT(11) DEFAULT 0 COMMENT '乐观锁版本号',
PRIMARY KEY (id)
);
插入一条数据
INSERT INTO t_product (id, NAME, price) VALUES (1, '外星人', 100);
在pojo包下创建Product类
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("t_product")
public class Product {
private Long id;
private String name;
private Integer price;
private Integer version;
}
在mapper包下创建ProductMapper接口
@Repository
@Mapper
public interface ProductMapper extends BaseMapper {
}
冲突测试:
@Autowired
private ProductMapper productMapper;
@Test
public void testProduct(){
//小李查询价格
Product productLi = productMapper.selectById(1);
System.out.println("小李查询的商品价格:"+productLi.getPrice());
//小王查询价格
Product productWang = productMapper.selectById(1);
System.out.println("小王查询的商品价格:"+productWang.getPrice());
//小李将商品价格+50
productLi.setPrice(productLi.getPrice()+50);
productMapper.updateById(productLi);
//小王将商品价格-30
productWang.setPrice(productWang.getPrice()-30);
productMapper.updateById(productWang);
//老板查询商品价格
Product productLaoan = productMapper.selectById(1);
System.out.println("老板查询的商品价格:"+productLaoan.getPrice());
}
结果:
不对
d e>mybatisplus实现乐观锁说明:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下
newVersion = oldVersion + 1
newVersion
会回写到entity
中- 仅支持
updateById(id)
与update(entity, wrapper)
方法 - 在
update(entity, wrapper)
方法下,wrapper
不能复用!!!
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("t_product")
public class Product {
private Long id;
private String name;
private Integer price;
@Version
//表示乐观锁版本号字段
private Integer version;
}
乐观锁插件配置:
spring xml 方式:
spring boot 注解方式:
在java文件夹创建一个配置文件夹config,在里面创建一个插件配置类mybatisplusconfig,添加插件
package config;
@Configuration
@MapperScan(basePackages = {"mapper"})//引导类扫描定义的接口
public class MybatisPlusConfig {
/**
* 分页插件配置
*从MyBatis-Plus 3.4.0开始,不再使用旧版本的PaginationInterceptor ,而是使用MybatisPlusInterceptor。
*旧版本分页插件
* @Bean
* public PaginationInterceptor paginationInterceptor() {
* return new PaginationInterceptor();
* }
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
* 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//添加分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
// @Bean
// public ConfigurationCustomizer configurationCustomizer() {
// return configuration -> configuration.setUsetUseDeprecatedExecutor(false);
// }
}
测试:
同上
结果:依然不对
优化测试: @Autowired
private ProductMapper productMapper;
@Test
public void testProduct(){
//小李查询价格
Product productLi = productMapper.selectById(1);
System.out.println("小李查询的商品价格:"+productLi.getPrice());
//小王查询价格
Product productWang = productMapper.selectById(1);
System.out.println("小王查询的商品价格:"+productWang.getPrice());
//小李将商品价格+50
productLi.setPrice(productLi.getPrice()+50);
productMapper.updateById(productLi);
//小王将商品价格-30
productWang.setPrice(productWang.getPrice()-30);
//判断修改的版本是否正确,result=0表示修改的版本错误,即有人刚修改了内容
int result=productMapper.updateById(productWang);
if (result==0){
//重新获取版本号,修改内容
Product productNew=productMapper.selectById(1);
productNew.setPrice(productNew.getPrice()-30);
productMapper.updateById(productNew);
}
//老板查询商品价格
Product productLaoan = productMapper.selectById(1);
System.out.println("老板查询的商品价格:"+productLaoan.getPrice());
}
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)