mysql的表锁和行锁

区别:有索引的时候就是行锁,没有索引的时候就是表锁

InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的

表锁和行锁的使用场景

对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个另特殊事务中,也可以考虑使用表级锁。

  • 第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。
  • 第二种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销。

MySQL大致可归纳为以下3种锁

  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

MySQL表级锁有两种模式

表共享锁(Table Read Lock)和表独占写锁(Table Write Lock)。

  • 对MyISAM的读操作,不会阻塞其他用户对同一表读请求,但会阻塞对同一表的写请求;
  • 对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作;
  • MyISAM表的读操作和写操作之间,以及写操作之间是串行的。

当一个线程获得对一个表的写锁后,只有持有锁线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止

InnoDB实现了以下两种类型的行锁

  • 共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁(不允许写)读写互斥。
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁(其他事务,不能读,不能写),所以,独占写锁 (排他锁) 是,读写互斥、写写互斥的。
相关推荐
那我掉的头发算什么2 分钟前
【Linux】Linux基本使用和程序部署
linux·运维·服务器·数据库·spring·mybatis
LSL666_4 分钟前
11 redis核心配置参数
数据库·redis·缓存
江畔柳前堤6 分钟前
XZ07_解决WORD中间单词间隔过大的问题
数据库·人工智能·线性代数·oracle·数据挖掘·word
Elastic 中国社区官方博客1 小时前
SearchClaw:将 Elasticsearch 通过可组合技能引入 OpenClaw
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
娇娇yyyyyy2 小时前
Qt编程(3): 信号和槽函数
开发语言·数据库·qt
乌鸦乌鸦你的小虎牙5 小时前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
一只大袋鼠6 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Anastasiozzzz6 小时前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭6 小时前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
沙漏无语8 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb