ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql 锁分类

2022-06-25 09:31:52  阅读:150  来源: 互联网

标签:事务 加锁 行锁 分类 索引 mysql 共享 表锁


1. 按属性分:

 
a. 共享锁(读锁) S:当一个事务对数据添加读锁后,其他事务只能对该数据加读锁,不能做修改操作,也就是加写锁。
b. 排他锁(写锁) X:当一个事务对数据添加写锁后,其他事务既不能对该数据加读锁,也不能加写锁。只有等待当前写锁释放后,才能进行后续加锁操作。

 


2. 按状态分:


a. 意向共享锁 IS:事务有意向对表中的某些行加共享锁。事务在获得某些行的共享锁之前,要先获得表的意向共享锁。
b. 意向排他锁 IX:事务有意向对表中的某些行加排他锁。事务在获得某些行的排他锁之前,要先获得表的意向排他锁。

 

意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。意向锁是表锁,不会与行级的共享锁、排他锁互斥,与表级的共享锁、排他锁兼容关系如下:

 

意向共享锁 IS

意向排它锁 IX

共享锁(表级)

兼容

互斥

排他锁(表级)

互斥

互斥

 

 

3. 按粒度分:


a. 全局锁: 对整个数据库实例加锁,让整个库处于只读状态,命令是Flush tables with read lock (FTWRL),通常用于数据备份。
b. 表锁:表锁分为表锁和元数据锁(MDL)

  • 表锁:加锁语句lock tables t1 read, t2 write; 可以用 unlock tables 主动释放锁。
  • 元数据锁(metadata lock):MDL不需要显示使用,在访问表时自动加上,最主要的目的是防止DDL与DML并发冲突。

需要注意的是DML读锁保证的是表结构不能修改,与表数据无关,可以对数据进行操作,与读锁有区别。MDL写锁保证的是表结构不能修改,并且数据也不能读取。

c. 页锁:页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。目前只有BDB引擎支持页级锁。

d. 行锁:行锁是粒度最小、发生锁冲突概率最低、并发度最高的锁,但是加锁慢、开销大,容易发生死锁现象。目前只有innodb引擎支持行锁,行锁通过锁索引来实现,当无法通过索引来加锁时,行锁会转成表锁。

记录锁、间隙锁和临键锁都属于行锁。

 

 

4. 按模式分:

 

a. 乐观锁:乐观锁假设数据不会发生冲突,只有在数据提交更新时才会检测是否冲突,如果冲突了才会返回错误信息。适用于读多写少的场景。

b. 悲观锁:悲观锁具有强烈的独占和排他特性,适用于并发量不大、写入比较频繁、数据一致性比较高的场景。Mysql中的共享锁和排他锁都属于悲观锁。

 

 

5.按算法分

 

a. 记录锁:精准命中唯一索引或主键索引时加记录锁,避免不可重复读和脏读问题。

b. 间隙锁:普通索引、联合索引命中,或者唯一索引命中多行数据时加锁,避免幻读问题。

c. 临键锁:记录锁和间隙锁的组合,索引命中多行数据时加锁,避免脏读、幻读和不可重复读三个问题。

 

脏读:事务B读到事务A未提交的数据。

幻读:同一事务内两次读取数据,记录数不一样。

不可重复读:同一事务内两次读取数据,获得的内容不一样。

标签:事务,加锁,行锁,分类,索引,mysql,共享,表锁
来源: https://www.cnblogs.com/turboty/p/16410777.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有