首页 > 数据库 >6.MySQL锁

6.MySQL锁

时间:2023-09-19 14:56:26浏览次数:38  
标签:行级 快照 记录 Lock InnoDB MySQL 表级

  锁是一种常见的并发事务的控制方式。
(1)表级锁和行级锁了解吗?有什么区别?
  MyISAM 仅仅支持表级锁(table-level locking),一锁就锁整张表,这在并发写的情况下性非常差。InnoDB 不光支持表级锁(table-level locking),还支持行级锁(row-level locking),默认为行级锁。
  行级锁的粒度更小,仅对相关的记录上锁即可(对一行或者多行记录加锁),所以对于并发写入操作来说, InnoDB 的性能更高。
表级锁和行级锁对比:
  表级锁:MySQL 中锁定粒度最大的一种锁(全局锁除外),是针对非索引字段加的锁,对当前操作的整张表加锁,实现简单,资源消耗也较少,加锁快,不会出现死锁。不过,触发锁冲突的概率最高,高并发下效率极低表级锁和存储引擎无关,MyISAM和InnoDB引擎都支持表级锁。
  行级锁:MySQL中锁定粒度最小的一种锁,是针对索引字段加的锁 ,只针对当前操作的行记录进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁行级锁和存储引擎有关,是在存储引擎层面实现的。
 
(2)行级锁的使用有什么注意事项?
InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中唯一索引或者索引失效的话,就会导致扫描全表对表中的所有行记录进行加锁
不过,很多时候即使用了索引也有可能会走全表扫描,这是因为 MySQL 优化器的原因。
 
(3)InnoDB 有哪几类行锁?
记录锁(Record Lock) :也被称为记录锁,属于单个行记录上的锁。
间隙锁(Gap Lock) :锁定一个范围,不包括记录本身。
临键锁(Next-Key Lock) :Record Lock+Gap Lock,锁定一个范围,包含记录本身,主要目的是为了解决幻读问题(MySQL 事务部分提到过)。记录锁只能锁住已经存在的记录,为了避免插入新记录,需要依赖间隙锁。
  在InnoDB 默认的隔离级别 REPEATABLE-READ下,行锁默认使用的是Next-Key Lock。但是,如果操作的索引是唯一索引或主键,InnoDB会对Next-Key Lock进行优化,将其降级为 Record Lock,即仅锁住索引本身,而不是范围。
 
不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)。排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。
由于 MVCC 的存在,对于一般的 SELECT 语句,InnoDB 不会加任何锁。不过, 你可以通过以下语句显式加共享锁或排他锁。
 
(4)意向锁有什么作用:
  如果需要用到表锁的话,如何判断表中的记录没有行锁呢,一行一行遍历肯定是不行,性能太差。我们需要用意向锁来快速判断是否可以对某个表使用表锁。
意向锁是表级锁
  · 意向共享锁(Intention Shared Lock,IS 锁):事务有意向对表中的某些记录加共享锁(S 锁),加共享锁前必须先取得该表的 IS 锁。
  · 意向排他锁(Intention Exclusive Lock,IX 锁):事务有意向对表中的某些记录加排他锁(X 锁),加排他锁之前必须先取得该表的 IX 锁。
意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享/排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。
意向锁之间是互相兼容的。
意向锁和共享锁和排它锁互斥(这里指的是表级别的共享锁和排他锁,意向锁不会与行级的共享锁和排他锁互斥)。
 
(5)当前读和快照读区别:
当前读 (一致性定读)就是给行记录加X锁或S锁。

# 对读的记录加一个X锁 SELECT...FOR UPDATE # 对读的记录加一个S锁 SELECT...LOCK IN SHARE MODE # 对修改的记录加一个X锁 INSERT... UPDATE... DELETE...
快照读(一致性非锁定读)就是单纯的SELECT语句
  快照即记录的历史版本,每行记录可能存在多个历史版本(多版本技术)。
  快照读的情况下,如果读取的记录正在执行 UPDATE/DELETE 操作,读取操作不会因此去等待记录上 X 锁的释放,而是会去读取行的一个快照。
只有在事务隔离级别RC(读取已提交) 和RR(可重读)下,InnoDB才会使用一致性非锁定读:
  在 RC 级别下,对于快照数据,一致性非锁定读总是读取被锁定行的最新一份快照数据。(提交读)
  在 RR 级别下,对于快照数据,一致性非锁定读总是读取本事务开始时的行数据版本。(可重复读)
快照读比较适合对于数据一致性要求不是特别高且追求极致性能的业务场景。
 
(6)自增锁:
关系型数据库设计表的时候,通常会有一列作为自增主键。InnoDB 中的自增主键会涉及一种比较特殊的表级锁— 自增锁(AUTO-INC Locks) 。
如果一个事务正在插入数据到有自增列的表时,会先获取自增锁,拿不到就可能会被阻塞住。
 

标签:行级,快照,记录,Lock,InnoDB,MySQL,表级
From: https://www.cnblogs.com/cjhtxdy/p/17714620.html

相关文章

  • python连接mysql
    pymysql是Python的一个MySQL数据库操作库,支持连接MySQL服务器,并进行数据库操作。例如以下代码段演示了如何使用pymysql库将数据存储到MySQL数据库py代码importpymysqldb=pymysql.connect(host='localhost',user='test',password='test',database='test',charset='utf8'......
  • python处理xls数据并保存到mysql数据库
    #-*-coding:utf-8-*-#CreatedbyY.W.on2017/7/3117:46.importpymysqlimportxlrd#获取xlsx文件,获取sheet文件try:book=xlrd.open_workbook('D:/test.xls')sheet=book.sheet_by_name(u'Sheet1')exceptExceptionase:prin......
  • MySQL优化(业务系统)
    影响一个系统的运行速度的原因是多方面的,前端、后端、数据库、中间件、服务器、网络等等,今天我们从常常被关注的数据库角度出发。跟系统的优化方向一样,数据库的优化,也是多方面的,其中涵盖着SQL语句的执行情况,数据库自身的情况等等,数据库种类众多,下面我们以目前常用的Mysql数据库为......
  • MySQL篇:第八章_详解TCL语言
    事务一、含义事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行二、特点(ACID)A原子性:一个事务是不可再分割的整体,要么都执行要么都不执行C一致性:一个事务可以使数据从一个一致状态切换到另外一个一致的状态I隔离性:一个事务不受其他事务的干扰,多个......
  • MySQLSQL查询的优化技巧及详细SQL语句和解释
    在实际的数据库应用中,复杂的SQL查询可能会导致性能下降,从而影响应用的响应时间和用户体验。为了提升查询性能,我们可以采用一些优化技巧。本文将介绍一些针对复杂SQL查询的优化技巧,并提供详细的SQL语句和解释,帮助您优化MySQL数据库中的复杂查询。使用索引:索引是提高查询性能的关键......
  • centos7使用mysql压缩包安装mysql5.7
    centos7使用mysql压缩包安装mysql5.71、安装相关的命令环境安装vim命令yum-yinstallvim*安装netstat命令yum-yinstallnet-tools2、上传mysql压缩包到/usr/local/并解压重名mysql-5.7.37-el7-x86_64.tar.gz解压mysql安装包tar-zxvfmysql-5.7.37-el7-x86_64.t......
  • centos7安装mysql8
    1.查看是否已经安装了mysqlrpm-qa|grepmysql#无输出说明没有安装2.下载rpm2.1手动下载打开网址:MySQLYum存储库选择linux7,点击下载2.2wget下载wgethttps://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm3.安装mysql源rpm-ivhmysql80-commun......
  • 2.MySQL存储引擎
    MySQL有Server层和存储引擎层,存储引擎层为插件式实现,redolog为InnoDB独有。1.MySQL支持哪些存储引擎?默认使用哪个?所有的存储引擎中只有InnoDB是事务性存储引擎,也就是说只有InnoDB支持事务。 2.MySQL存储引擎架构了解吗?MySQL存储引擎采用的是插件式架构,支持......
  • 3.MySQL索引
    1.索引:是一种用于快速查询和检索数据的数据结构,其本质可以看成是一种排序好的数据结构。常见的索引结构有:B树,B+树和Hash、红黑树。在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作为索引结构。2.索引优缺点:优点:使用索引可以大大加快数据的检索速度(大大减少检索的数......
  • MYSQL SQL做题总结
    一.关于join1.内外左右连接2.交叉联结(corssjoin)使用交叉联结会将两个表中所有的数据两两组合。如下图,是对表“text”自身进行交叉联结的结果:3.三表双双连接力扣题目a与b表笛卡尔积,再与c表左连接。SELECTa.student_id,a.student_name,b.subject_name,count(c.subject......