mysql数据库之行级锁
行级锁,每次操作锁住对应的行数据,锁定粒度最小,发生锁冲突的概率最低,并发度最高。英英在innodb存储引擎中。
innodb的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
1、行锁(record lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
2、间隙锁(GAP lock):锁定索引记录间隙(不含该记录),确保所有记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读,在RR隔离级别下都支持。
3、临键锁(next-key lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙gap,在RR隔离级别下支持。
一、行锁。
innodb实现以下两种类型的行锁。
1、共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。
2、排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
当前所类型/请求锁类型 | S(共享锁) | X(排他锁) |
---|---|---|
S(共享锁) | 兼容 | 冲突 |
X(排他锁) | 冲突 | 冲突 |
3、操作增删改查时加的行锁类型。
SQL | 行锁类型 | 说明 |
---|---|---|
insert | 排他锁 | 自动加锁 |
update | 排他锁 | 自动加锁 |
delete | 排他锁 | 自动加锁 |
select(正常) | 不加任何锁 | |
select ... lock in share mode | 共享锁 | 需要手动在select之后加 lock in share mode |
select ... for update | 排他锁 | 需要手动在select之后加 for update |
4、演示。
默认情况下,innodb在repeatable事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读。
a.针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
共享锁之间兼容
释放第二个事务的行锁
共享锁和排他锁不兼容,id为3的可以修改,id为1的不能修改,因为id为1加了行锁。
排他锁互斥,提交后即可修改。
b. innodb的行锁是针对于索引加的锁,不通过索引条件检索数据,那么innodb将对表中的所有记录加锁,此时就会升级为表锁。
name没有索引,所以对所有的记录加锁,升级为表锁,所以阻塞了。
给name加索引,成功执行。
二、间隙锁和临键锁。
默认情况下,innodb在repeatable read事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读。
1、索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁。
间隙锁锁住,不能插入新数据
事务提交后,成功添加新数据
2、索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
非唯一等值索引,为了避免出现幻读现象,加上一把间隙锁。
3、索引上的范围查询(唯一索引)会访问到不满足条件的第一个值为止。
范围查询时给19加行锁锁住,加临键锁直接25这一行及25之前的间隙,加临键锁锁正无穷大以及正无穷到25之间的间隙。
注意:间隙锁唯一目的是防止其他事务插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会组织另一个事务在同一间隙上采用间隙锁。
间隙锁锁的是间隙,不包含对应的数据记录,临键锁不仅会包含当前的数据记录,也会锁定该数据记录之前的间隙。
mysql数据库之行级锁相关推荐
- mysql数据库的行级锁有几种_MySQL中的行级锁、表级锁、页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM ...
- mysql数据库的行级锁有几种_数据库行级锁和表锁区别
MyISAM和InnoDB MyISAM MyISAM使用B+tree作为索引结构,叶节点存放的是数据地址. MyISAM不支持事务和外键. MyISAM是表锁,对数据库写操作时会锁住整个表,效率低. ...
- mysql数据库的行级锁有几种_mysql锁之三种行级锁介绍
本文主要介绍 1.mysql三种行锁介绍 2.RR模式下,next-key lock为什么可以解决幻读问题 首先,创建一张表: mysql> show create table test01\G ...
- MySQL中的行级锁,表级锁,页级锁
数据库锁是数据库系统中非常重要的一个概念,本文将深入分析数据库中的锁相关知识,您可点击下方音频收听或直接查看文稿中的文字. 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并 ...
- Mysql中的行级锁、表级锁、页级锁
转载自 Mysql中的行级锁.表级锁.页级锁 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按 ...
- MySQL中MVCC+行级锁的工作机制(源码佐证)
转自:https://blog.csdn.net/Waves___/article/details/105295060 序 最近在学习MySQL中的MVCC,看了网上的各种版本,什么创建版本号.删除版 ...
- MySQL高级【行级锁】
1:行级锁 1.1:介绍 行级锁,每次操作锁住对应的行数据.锁定粒度最小,发生锁冲突的概率最低,并发度最高.应用在 InnoDB存储引擎中. InnoDB的数据是基于索引组织的,行锁是通过对索引上的索 ...
- MySQL数据库事务中的行级锁,表级锁,页级锁
锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...
- kotlin mysql数据库_在kotlin中使用mysql行级锁
mysql中的锁 首先需要介绍一下mysql的锁.一般我们使用InnoDB数据库引擎+行级锁,SQL为:SELECT * FROM table where id = 1 for update;.for ...
最新文章
- java 初始化系统参数_系统中参数的初始化 参数在系统中配置
- 如何将Sql Server中的数据表导入到PowerDesigner中
- [临时]关于tar.gz .gz的压缩研究
- java 泛型集合应用_Java泛型集合的应用和方法
- 图片缩小不失真_科技论文中图片的处理方法有哪些?
- calendar的使用以及如何获取某月份最后一天的方法
- 感觉csdn论坛不是很好用,感觉……
- Python实现机器学习
- 某LINUX平台,管道open直接崩溃
- Go:http request cancelled 服务端感知
- adb 修改安卓设备的Mac地址
- Postman汉化教程
- 周纪一 威烈王二十三年(戊寅、前403)——摘要
- 贝塞尔曲线最小二乘法拟合(随意切向/切向方向统一)------路适用于绝大多数的最小二乘法拟合
- 关于vscode中出现gopls was not able to find modules in your workspace报错的解决方案
- The connection to the server 192.168.229.131:6443 was refused - did you specify the right host or po
- 探究音节bo、po、 mo、 fo韵母的实际发音
- Linux 平台下 误删 oracle 数据文件的恢复方法
- 永磁同步电机simulink仿真——PMSM矢量控制
- cbrt c语音_sqrt - [ C语言中文开发手册 ] - 在线原生手册 - php中文网