深入理解数据库行锁与表锁
当插入数据时,就锁定表,这叫做”锁表”;当更新数据时,就锁定行,这叫做”锁行”。
锁在数据网络传输中是一个非常重要的概念,当多个用户对数据库进行操作时,会带来数据不一致的情况,所以,锁主要是在多用户情况下保证数据库数据完整性和一致性。
当然,数据库中的锁远不止于上面提到的两种。通常提及数据库锁,想必大家优先想到的,必然是乐观锁,数据库乐观锁可以帮助我们解决很多问题,但数据库中还有很多其它的锁,总结一下大概有如下:悲观锁、乐观锁、表锁、行锁、临间锁、间隙锁、记录锁、共享锁、排他锁、意向共享锁、意向排他锁。
Mysql中的锁机制基本上都是采用的悲观锁来实现的。我们先来看一下”行锁”。
行锁
顾名思义,行锁就是一锁锁一行或者多行记录,mysql的行锁是基于索引加载的,所以行锁是要加在索引响应的行上,即命中索引。
数据库表中有一个主键索引和一个普通索引,Sql语句基于索引查询,命中两条记录。此时行锁一锁就锁定两条记录,当其他事务访问数据库同一张表时,被锁定的记录不能被访问,其他的记录都可以访问到。
行锁的特征:锁冲突概率低,并发性高,但是会有死锁的情况出现。
表锁
顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作。表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划看出扫描了多少条记录。
由于表锁每次都是锁一整张表,所以表锁的锁冲突几率特别高,表锁不会出现死锁的情况。
当更新数据库数据时,如果没有触发索引,则会锁表,锁表后再对表做任何变更操作都会导致锁冲突,所以表锁的锁冲突概率较高。
在mysql中,行锁又衍生了其他几种算法锁,分别是 记录锁、间隙锁、临键锁;我们依次来看看这三种锁,什么是记录锁呢?
记录锁
我们找到行锁是命中索引,一锁锁的是一张表的一条记录或者是多条记录,记录锁是在行锁上衍生的锁,我们来看看你记录锁的特征:
记录锁:记录锁锁的是表中的某一条记录,记录锁的出现条件必须是精准命中索引并且索引是唯一索引,如主键id,就像我们上面描述行锁时使用的sql语句图,在这里就挺适用的。
图中id是唯一索引,此时锁的就是一条记录,命中索引为唯一索引,此时使用的锁就是记录锁了。相信学习完行锁后,再学习记录锁就简单很多了吧。
间隙锁
间隙锁又称之为区间锁,每次锁定都是锁定一个区间,隶属行锁。既然间隙锁隶属行锁,那么,间隙锁的触发条件必然是命中索引的,当我们查询数据用范围查询而不是相等条件查询时,查询条件命中索引,并且没有查询到符合条件的记录,此时就会将查询条件中的范围数据进行锁定(即使是范围库中不存在的数据也会被锁定),我们通过代码演示一下:
间隙锁只会出现在可重复读的事务隔离级别中,mysql5.7默认就是可重复读。间隙锁锁的是一个区间范围,查询命中索引但是没有匹配到相关记录时,锁定的是查询的这个区间范围,上述代码中,所锁定的区间就是 (1,3]这个区间,不包含1,但是包含3,并且不包含4,也就是说这里是一个左开右闭的区间。
设置事务隔离级别为不可重复读
set session transaction isolation level read committed;
查看当前事务级别
SELECT @@tx_isolation
临键锁
mysql的行锁默认就是使用的临键锁,临键锁是由记录锁和间隙锁共同实现的,上面我们学习间隙锁时,间隙锁的触发条件是命中索引,范围查询没有匹配到相关记录。而临键锁恰好相反,临键锁的触发条件也是查询条件命中索引,不过,临键锁有匹配到数据库记录;
深入理解数据库行锁与表锁相关推荐
- MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解...
2019独角兽企业重金招聘Python工程师标准>>> MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何 ...
- 数据库中的行锁和表锁
一.事务并发调度的问题 脏读:A事务读取B事务尚未提交的更改数据,并在这个数据基础上操作.如果B事务回滚,那么A事务读到的数据根本不是合法的,称为脏读.在oracle中,由于有version控制,不会 ...
- Mysql之数据库锁(表锁和行锁)详解
1. 什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种共享资源,如何保证数据并发访问的一致性.有效性 ...
- mysql和oracle的锁_关于数据库行锁与表锁的认识
MySQL MySQL(InnoDB存储引擎)默认是自动提交事务的,所以这个测试,需要先将MySQL的autocommit设置为0,关闭自动提交,需要自己手动提交事务 -- 关闭自动提交 set au ...
- mysql innodb 全表锁,Mysql InnoDB行锁及表锁分享
一. 背景知识 二. 步入正题:表锁和行锁 1.1. 表锁 vs 行锁 在 MySQL 中锁的种类有很多,但是最基本的还是表锁和行锁:表锁指的是对一整张表加锁,一般是 DDL 处理时使用,也可以自己在 ...
- select for update加了行锁还是表锁?
前言 大家,我是田螺. 最近在开发需求的时候,用到了select......for update.在代码评审的时候,一位同事说 ,唯一索引+一个非索引字段,是否可能会锁全表呢?本文田螺哥将通过9个实验 ...
- MySQL中的锁(表锁、行锁)
锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...
- mysql某个表被行锁了_MySQL中的锁(表锁、行锁)
锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...
最新文章
- hibernate.cfg.xml的一些事
- 中琛源主要的产品是什么
- NSRunLoop NSTimer
- 压力测试神器stresstester源码分析
- win10系统时间与服务器同步报错,图文介绍win10系统电脑时间同步出错的解决技巧...
- sklearn学习——递归特征消除法(RFE)
- CUDA out of Memery 解决方法
- 如何增强云端医疗健康数据的隐私保护
- 统计基础(九)多元回归模型
- 2019.01.12 Presto中国区用户线下Meetup
- asc量子计算机,2020ASC世界大学生超级计算机竞赛聚焦量子计算和语言智能
- OpenCVSharp学习(五):关于摄像头的操作,打开,拍照,录视频
- 开发一个导出功能,将echarts图表导出到excel文件中
- Jade 6.0的使用
- python面对对象建立自己的电子宠物的编码_一种基于Kinect技术的电子宠物的制作方法...
- PLSQL批量导出导入存储过程
- STM32CbueMX之SPI_FLASH + FATFS + USB MSC + 虚拟扩容
- php表格线属性在哪里,HTML_HTML表格标记教程(2):表格的边框属性BORDER,默认情况下,表格的边框为0, - phpStudy...
- 哈佛图书馆的20条校训 辟谣!!!
- keil仿真问题no ulink device
热门文章
- javascript(js)获取访客通过搜索引擎进入页面的搜索关键词的简洁有效代码
- Vista Media Center 开发之深入浅出 (二) --Vista Media Center 程序的新建及部署
- ESFramework介绍之(31)―― 消息分类及对应的处理器
- 在 Ubuntu 环境下实现插入鼠标自动关闭触摸板
- 26.多线程join detach
- 《大道至简》第一章java伪代码分析
- html、css 【珍藏】
- 汽车保险解读:解析涉水损失险与自燃险
- Windows7无损分区
- delphi开发日志——基窗体,使用面向对象编程的编程思想创建基类