先讲一个故事。一件商品成本80元,售价100元。某天老板觉得100元太便宜了,就通知小李去涨价50元,但是小李玩游戏去了。然后老板觉的150元太贵了,又通知小王去降价30元。
这个时候小李也想起了老板的吩咐,两个人同时去改变商品的价格。小李先取出商品的价格100元,然后加50,再将150元存入数据库。这个时候小王取出商品的价格100元,降价30元,变成70元也存入数据库,这样小王的操作就完全覆盖了小李的操作,商品现在只卖70元。一分钟过后,卖了1000多件商品,老板亏本了一万多元。
所以并发无小事,可能稍有不慎,就会给公司带来巨大的损失。
这个时候可以使用mybatisPlus的乐观锁。
1.在表中添加一个version的字段
2需要在实体类上加上@Version注解
3.配置mybatisPlus的乐观锁的拦截器。
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor optimisticLockerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
这个和java中的cas类似,失败后可以重试。效率比较高