1、模拟修改冲突
解决乐观锁的方法:就是提高版本号的操作;这个在我们的并发编程中有所体现:如下图
在JUC 并发编程里面使用的是引用版本号加原子引用;
1、创建一个数据库,添加一个数据
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)
2、编写pojo
@Data
public class Product {
private Long id;
private String name;
private Integer price;
private Integer version;
}
3、编写ProductMapper接口
@Repository
public interface ProductMapper extends BaseMapper<Product> {
}
4、测试:
@Test
public void productTest(){
//注意:每次运行前先保证数据库的数据正确统一:(初始:price:100,version : 0)
//小李查询商品价格;
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);
int result = productMapper.updateById(productWang);
//老板查询;
Product productLBoss = productMapper.selectById(1);
System.out.println("老板获取的商品:"+productLBoss.getPrice());
}
测试结果:小李100,小王100,老板70;
2、乐观锁插件
注意:
添加了小王第二次获得锁的业务逻辑的判断;小王只有获得版本号,才能进行操作。
@Test
public void productTest(){
//注意:每次运行前先保证数据库的数据正确统一:(初始:price:100,version : 0)
//小李查询商品价格;
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);
int result = productMapper.updateById(productWang);
if (result == 0){
//操作失败,重试;
Product productNew = productMapper.selectById(1);
productNew.setPrice(productNew.getPrice()-30);
productMapper.updateById(productNew);
}
//老板查询;
Product productLBoss = productMapper.selectById(1);
System.out.println("老板获取的商品:"+productLBoss.getPrice());
}
测试:OK
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/71819.html