mysql的表锁和行锁

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

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

表锁和行锁的使用场景

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

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

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

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

MySQL表级锁有两种模式

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

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

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

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

  • 共享锁(s):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁(不允许写)读写互斥。
  • 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁(其他事务,不能读,不能写),所以,独占写锁 (排他锁) 是,读写互斥、写写互斥的。
相关推荐
瀚高PG实验室2 分钟前
PostgreSQL CREATE TYPE 未检查 multirange schema 的 CREATE 权限HGVE-2026-E007
数据库·postgresql·瀚高数据库
xfan_me6 分钟前
手机在网状态接口-空号查询-空号过滤API
数据库·人工智能·python·智能手机
Java.熵减码农23 分钟前
MySQL 远程连接故障排查全记录(Linux + Docker + Navicat)
linux·mysql·docker
会博通·代码搬运工42 分钟前
双层PDF技术实现与档案数字化系统的API集成实践
数据库·人工智能·分布式·python·计算机视觉·api集成
Sagittarius_A*1 小时前
【好靶场】报错注入-sql注入-字符型
数据库·sql·web安全·网络安全·sql注入
HwJack201 小时前
鸿蒙ArkData键值型数据库实战:Schema 定义与商品库存同步案例
数据库·华为·harmonyos
oradh1 小时前
Oracle表在线重定义操作总结
数据库·oracle·oracle表在线重定义
拾光Ծ1 小时前
【MySQL】基础入门:库操库、数据表操作与数据类型详解
数据库·sql·mysql·数据类型·库操作·表操作
cspttty1 小时前
哪些证书可以弥补学历不足
大数据·数据库·数据挖掘
Chasing__Dreams1 小时前
向量数据库--Milvus--2--介绍
数据库·milvus