美文网首页mybatis
mybatis-plus使用乐观锁

mybatis-plus使用乐观锁

作者: rainbowz | 来源:发表于2020-09-07 18:02 被阅读0次

1商品的库存原本有100件,老板又进了50件货,一个小时后卖出了30件。此时小李和小王同时操作后台系统,小李操作的时候先取出库存100;小王也在操作,取出的库存也是100.小李将库存加了50,将结果100+50写入数据库;小王将库存减了30,并将100-30写入数据库。因为没有上锁,小李的操作完全被小王覆盖了

。现在的库存是70,对不上账了。

乐观锁与悲观锁,

如果是乐观锁,会检查一下库存是否被被人修改过了,如果修改过了会重新获取修改后的的库存。

如果是悲观锁,只有等到别人操作完成了,才能进行操作。

-- auto-generated definition
create table goods
(
    id      int auto_increment comment '商品id'
        primary key,
    name    varchar(30)   null comment '商品名称',
    stock   int default 0 null comment '商品库存',
    version int default 0 null comment '并发版本控制'
)
    comment '商品表' charset = utf8;



 @Test
    public void test_currentUpdate() {

        Goods good1 = goodsMapper.selectById(1);
        Goods good2 = goodsMapper.selectById(1);

        good1.setStock(good1.getStock() + 50);
        goodsMapper.updateById(good1);

        good2.setStock(good2.getStock() - 30);
        int result = goodsMapper.updateById(good2);
        if (result == 0) {
            Goods p2 = goodsMapper.selectById(1);
            p2.setStock(p2.getStock() - 30);
            goodsMapper.updateById(p2);
        }
        //最后的结果
        Goods goods3 = goodsMapper.selectById(1L);
        System.out.println("最后的结果:" + goods3.getStock());

    }
image.png

取出数据时获取当前的version,更新的时候比较version 如果version不对,更新失败。

UPDATE goodsSET stock=stock+50, `version`=`version` + 1 WHERE id=1 AND `version`=1
public class Goods implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 商品id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 商品名称
     */
    private String name;

    /**
     * 商品库存
     */
    private Integer stock;

    /**
     * 并发版本控制
     */
    @Version
    private Integer version;


}

加了version注解后

image.png

参考:https://www.xn2001.com/archives/512.html

通过乐观锁解决库存超卖的问题
https://segmentfault.com/a/1190000021875866

相关文章

  • mybatis-plus使用乐观锁

    1商品的库存原本有100件,老板又进了50件货,一个小时后卖出了30件。此时小李和小王同时操作后台系统,小李操作的...

  • MyBatis-Plus乐观锁插件的使用

    乐观锁是为了解决应用多实例,数据库单一实例时,并发修改同一条记录可能造成的并发问题。一般来说,乐观锁的实现方案都是...

  • Mybatis-Plus乐观锁插件

    乐观锁插件 主要适用场景 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时...

  • Mysql锁

    按照使用方式,锁分为: 悲观锁 乐观锁 乐观锁 概念就不细讲了,乐观锁和悲观锁的区别是乐观锁是假设在修改数据之前,...

  • Mybatis-Plus乐观锁应用以及乐观锁讲解

    1.乐观锁 主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新乐观锁...

  • 「mybatis-plus」什么是乐观锁?如何实现“乐观锁”

    今天就折腾一下“乐观锁”。 一、什么是乐观锁 乐观锁其实用一句话来形容其作用就是:当要更新一条记录的时候,希望这条...

  • Mybatis-plus 之乐观锁插件

  • MyBatis-plus中乐观锁实现

    乐观锁认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测。乐观锁一般通...

  • StampLock 之二

    乐观读锁的获取 乐观读锁只需要获取,不需要释放。只要没有线程获取写锁,那么就能获取到乐观读锁。当然,当使用由乐观读...

  • MySQL数据库InnoDB引擎的读写锁、事务隔离级别实例分析

    数据库锁分类 按性能分 乐观锁(比如使用version字段比对,无需等待)、悲观锁(需要等待其他事务) 乐观锁,如...

网友评论

    本文标题:mybatis-plus使用乐观锁

    本文链接:https://www.haomeiwen.com/subject/xaelektx.html