• mysql分布式锁的实现


    首先介绍:唯一索引,防止插入重复数据

     当批量插入数据时,像我们这个表,lockName设置为唯一索引了——>当重复插入相同数据就会报错——>Duplicate entry ' ' for key '索引' 

    insert into tb_name (field1,field2) values(f11,f12),(f21,f22)...

     ingore

    当插入多条数据,重复数据会直接跳过

    insert ignore into tb_name (field1,field2) values(f11,f12),(f21,f22)...

     Mysql乐观锁的实现

    在表中加一个version列,当进行数据操作时,需要更新version字段值+1——>操作前提:读取到的version和数据库中的version相同才能更新否则cas

    1. //1.查询数据的sql
    2. select * from tb_item_stock where item_id=10001;
    3. //2.修改数据的sql
    4. update tb_item_stock set stock=stock+1,version=version+1 where item_id=10001 and version=1;
    1. /**
    2. * 模拟多版本号
    3. */
    4. @Transactional
    5. public void deduct2(){
    6. //1.首先查询仓库里面的内容
    7. List stocks = this.stockMapper.queryStock("10001");
    8. //获取第一条仓库记录
    9. Stock stock = stocks.get(0);
    10. //2.判断仓库是否充足
    11. if(stock!=null&&stock.getStock()>0){
    12. //2.1扣减库存,然后设置新的版本号进行更新
    13. stock.setStock(stock.getStock()-1);
    14. Integer version = stock.getVersion(); //获取当前商品版本
    15. stock.setVersion(version+1); //更新一次版本加一次,如果中途有其他的更新操作就会失败
    16. //2.2然后进行更新——>需要进行判断如果更新影响行数为0就进行cas操作
    17. if(this.stockMapper.update(stock,new UpdateWrapper()
    18. .eq("item_id",stock.getItemId())
    19. .eq("version",version))==0){
    20. this.deduct2();//cas
    21. }
    22. }

     (36条消息) 随笔感悟:Mysql悲观锁和乐观锁_Fairy要carry的博客-CSDN博客

    Mysql分布式锁的实现

    我们这里就是创建一张锁表,通过表中的数据——>实现加锁和解锁,当需要锁住某个资源的时候我们就向表中插入一条记录,lockName设置为唯一index(加锁)——>好处:保证了插入的唯一性

     解锁:我们直接利用id进行判断删除

    1. /**
    2. * 1.数据库锁测试
    3. */
    4. public void deduct(){
    5. //0.加锁
    6. Lock lock = new Lock();
    7. lock.setLockName("lock");
    8. this.lockMapper.insert(lock);
    9. //1.业务处理
    10. System.out.println("拿到锁资源...");
    11. //2.解锁,根据锁的标识去删除
    12. this.lockMapper.deleteById(lock.getId());
    13. }

    死锁的处理和可重入锁的处理——>在表中设计好了,超时时间就释放,线程id,服务id,可重入次数等

  • 相关阅读:
    Wait-Notify机制
    JavaScript endsWith() 方法
    Spring5源码-监听器原理
    数学知识—不同数据范围求组合数,例题、思路、代码实现
    Shell
    Java基础八股
    攀爬倒影发光方块
    ETest系列产品1 | 便捷式嵌入式系统半实物仿真测试平台ETest_PT
    FPGA原理与结构——时钟IP核的使用与测试
    【LeetCode每日一题】——374.猜数字大小
  • 原文地址:https://blog.csdn.net/weixin_57128596/article/details/126907517