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 锁

锁是计算机协调多个进程或线程并发访问某一资源的机制(避免资源争抢),可以保证数据并发访问的一致性,但是加锁会增加系统的开销

锁的分类

对数据操作粒度 :
1) 表锁:操作时,会锁定整个表
2) 行锁:操作时,会锁定当前操作行
对数据操作的类型:
1) 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
2) 写锁(排它锁):当前操作没有完成之前,它会阻断其他写锁和读锁

存储引擎

mysql5.5之前默认采用的是MyISAM,5.5之后默认采用的是innodb

  • MyISAM(表锁)
    读、写锁调度为写优先,因为写锁后其他线程不能做任何操作,所以不适合用做以写为主业务场景
对于SELECT语句,会自动给涉及的所有表加读锁,会阻塞其它线程对同一表的写操作
对于UPDATE、DELETE和INSERT语句,会自动给涉及的表加写锁,会阻塞其它线程对同一表的读和写
  • MyISAM(行锁)
对于普通SELECT语句,不会加任何锁
对于UPDATE、DELETE和INSERT语句,会自动给涉及到的数据加排他锁

悲观锁

# step1: 查出商品状态(设置悲观锁)
select quantity from items where id=100 for update;
# step2: 根据商品信息生成订单
insert into orders(id,item_id) values(null,100);
# step3: 修改商品的库存
update Items set quantity=quantity-2 where id=100;
悲观锁是指在数据处理过程中使数据处于锁定状态,MySQL中使用悲观锁必须关闭MySQL的自动提交(set autocommit=0)
select ... for update是MySQL提供的悲观锁,此时在表中id为100的数据就被锁定,其它要执行select quantity from items where id=100 for update的事务必须等本次事务提交之后才能执行
select ... for update执行中所有扫描过的行都会被锁上,因此在使用悲观锁时必须确保索引有效,否则将会走全表扫描,将整个表锁住

乐观锁

# step1: 查询出商品信息
select quantity,version from items where id=100;
# step2: 根据商品信息生成订单
insert into orders(id,item_id) values(null,100);
# step3: 修改商品的库存
update items set quantity=quantity-1,version=version+1 where id=100 and version=#{version};
乐观锁在数据进行提交更新的时候,才会对数据的冲突与否进行检测,如果发现冲突了,则让返回错误信息
当提交更新的时候,判断表对应记录的版本信息与第一次取出来的version值,如果相等则予以更新,否则返回更新失败
商品库存扣减时,尤其是在秒杀、聚划算这种高并发的场景下,若采用version版本号作为乐观锁,则每次只有一个事务能更新成功,业务感知上就是大量操作失败

间隙锁

查找 id < 10的记录,此时数据库中id的值分别为1,2,3,4,6,9,而5,7,8就都是间隙。此时对 id < 10的记录加锁,不仅会对已存在的数据加锁,此时对间隙也会加锁

行锁升级为表锁

# 因为name字段是varchar类型,但更新时作为数字类型使用,所有会存在类型转化,索引失效,最终会导致行锁升级为表锁
select quantity from items where id=100 and name = 900;
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:37:22  更:2021-11-09 19:39:49 
 
开发: 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/24 4:35:29-

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