IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> mysql分布式锁的实现 -> 正文阅读

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

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

Mysql分布式锁的实现

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

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

  /**
     * 1.数据库锁测试
     */
    public void deduct(){
        //0.加锁
        Lock lock = new Lock();
        lock.setLockName("lock");
        this.lockMapper.insert(lock);

        //1.业务处理
        System.out.println("拿到锁资源...");

        //2.解锁,根据锁的标识去删除
        this.lockMapper.deleteById(lock.getId());
    }

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:35:41  更:2022-09-21 00:39:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:41:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码