数据库的锁的详细介绍
数据库的锁和索引的详细介绍
- 数据库的锁的详细介绍
- 全局锁
- 表级锁
- 表锁
- 元数据锁
- 意向锁
- 行级锁
- 行锁
- 间隙锁
- 临键锁
数据库的锁的详细介绍
最近看了一下数据库的锁和索引的相关知识,写个博客加深一下记忆。
全局锁
- 介绍:
全局锁就是对整个数据库实例进行加锁,加锁后整个实例就处于只读状态,后续的写语句,已经更新操作的事务提交语句都将被阻塞。
其典型是使用场景,就是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。 - 特点
数据库中加全局锁是一个比较中的操作,存在一下问题:
- 如果在主库上备份,那么在备份期间从库不能执行更新,业务基本上就得停摆。
- 如果在从库上备份,那么备份期间从库不能执行主库同步过来的二进制日志。导致主从延迟。
表级锁
- 介绍
表级锁,每次操作所住整张表。锁定力度大发生锁冲突的概率高,并发度最低。
对于表级锁,主要分为以下几类:
表锁
对于表锁分为两类:
表共享读锁
当加了读锁,锁不会阻碍自己或者其他事务有读的过程,但是会阻塞一切写的过程。
表独占写锁
加了写锁之后,只允许加锁事务进行读或者写,不允许其他事务进行读或者写。
元数据锁
元数据锁(meta data lock, MDL)
MDL加锁的过程是系统控制的,无需显示调用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免读或者查询语句与增删改操作的冲突,保证读写的正确性。
意向锁
为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中加入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。
- 意向共享锁(IS):由语句select …lock in share mode添加,与表锁共享锁兼容,与表锁排他锁互斥
- 意向排他锁(IX):由insert,update。delete,select…for update添加,与表锁共享锁,排他锁都互斥。意向锁之间不会互斥。
行级锁
- 介绍
行级锁,每次操作所致对应的行数据。锁定力度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
行锁
锁定单个记录的锁,防止其他事务对此进行update和delete。在RC,RR隔离级别下都支持。
InnoDB实现了两种类型的行锁:
1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
2.排他锁(X):允许获取排他锁的事务更新数据,组织其他事务获得相同的数据集的共享锁和排他锁。
注:默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读
1.针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将自动优化为行锁。
2.InnoDB的行锁是针对索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中是所有记录进行加锁此时就会升级为表锁。
间隙锁
锁定索引记录间隙(不含该记录),确保索引记录之间间隙不变,防止其他事务在这个间隙之间进行insert,产生幻觉,防止幻读。在RR隔离级别下都支持。
注:默认情况下,InnoDB在REPEATABLE READ事务隔离级别运行,InnoDB使用next-key锁进行搜索和索引扫描,以防止幻读。间隙锁的唯一目地时防止其他事务插入间隙。间隙锁可以共存,一个事务采用的间隙锁不会阻止另一个事务在同一个间隙上使用间隙锁。
- 唯一索引上的等值查询:给不存在的记录加锁时,优化为间隙锁。
- 普通索引上的等值查询(非唯一索引):向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁
- 唯一索引上的范围查询:会访问到不满足条件的第一个值为止。
临键锁
行锁和间隙锁结合,同时锁住数据,并锁住数据前面的间隙Gap,在RR隔离级别下支持。
数据库的锁的详细介绍相关推荐
- 数据库having的用法详细介绍
转自:微点阅读 https://www.weidianyuedu.com 数据库having的用法的用法你知道吗?下面微点阅读小编就跟你们详细介绍下数据库having的用法的用法,希望对你们有用. ...
- 阿里云数据库POLARDB使用方法详细介绍
阿里云数据库POLARDB使用方法介绍 POLARDB是阿里云自研的下一代关系型云数据库,有三个独立的引擎,分别可以100%兼容MySQL.100%兼容PostgreSQL.高度兼容Oracle语法, ...
- 关于8锁问题详细介绍
关于8锁问题 1.两个同步方法,一个对象调用.乌龟先跑?还是兔子先跑? 答:乌龟先跑 /*** @Description:* @Package: com.cp.lock8* @ClassName: L ...
- 数据库设计三范式详细介绍--数据库设计规范之数据库设计三范式
为什么需要数据库设计 1. 我们在设计数据表的时候要考虑很多问题问题,比如: 用户都需要什么数据?需要在数据表中保存哪些数据? 如果保证数据表中数据的正确性,当插入.删除.更新的时候该进行怎么样的约束 ...
- 数据库的锁机制(悲观锁/乐观锁)
在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲 ...
- oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...
本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...
- mysql innodb 锁类型_详细介绍MySQL InnoDB存储引擎各种不同类型的锁
本文中,我们详细介绍MySQLInnoDB存储引擎各种不同类型的锁,以及不同SQL语句分别会加什么样的锁. 阅读提示 1.本文所参考的MySQL文档版本是8.0,做实验的MySQL版本是8.0.13 ...
- Tempdb数据库详细介绍
Tempdb数据库详细介绍 一.Tempdb简介 tempdb是SQLServer的系统数据库一直都是SQLServer的重要组成部分,用来存储临时对象.可以简单理解tempdb是SQLServer的 ...
- oracle23290,详细介绍Oracle数据库EM Console重建过程
详细介绍Oracle数据库EM Console重建过程 本文详细介绍了Oracle数据库中EM Console重建的一些知识以及重建时的错误分析与解决,希望能够对您有所帮助. Oracle数据库操作中 ...
最新文章
- 网络工程师_TCP握手之类的
- WF4.0入门系列1——创建一个简单的工作流
- [Apache] Apache 從 2.2 換至 2.4 httpd.conf 的調整筆記 (windows 環境)
- 关于CKEditor 4.0 过滤html标签
- linux怎么启动端口服务,Linux 根据端口快速停止服务并启动的办法
- 迈普路由器访问控制列表配置命令_如何选购企业路由器?选购企业路由器需注意什么...
- 直播P2P技术1-技术入门
- OpenShift 4 - Fedora CoreOS (4) - 用 Ignition 定制 CoreOS 的网络/存储等配置
- ubuntu之更新cmake版本
- 【Java编译】含package的类文件编译
- conda安装与入门
- STC12C5A60S2在LCD1602基本显示程序
- 两个不同网段的局域网如何互通_不同品牌的对讲机如何实现互通?
- HTML5课题意义,毕业论文选题的意义万能套话
- [解决] ie打不开网页自动跳转至hao.360.cn导航页
- python 循环十次_python机器学习——十次交叉验证训练的数据准备算法
- Macbook Pro 外接显示器关闭內建屏幕的方法,开盖状态
- 基于SSM的网上书城系统设计与实现
- vue 项目安装 openlayer 加载高德地图
- 【哈佛学习力6:学习生活化】
热门文章
- postgres数据库执行脚本时,错误ERROR: unterminated quoted string at or near处理
- 深度相机中提取深度信息
- php 获取文章内容首图,公众号文章首图要怎么做?公众号文章首图模板精选合集...
- python相关操作(二)控制手机操作
- 计算FPS的六种方式
- java SE(五)——(面向对象)OOP编程
- 【机器学习】逻辑回归-基础认识与鸢尾花分类实操案例
- JAVA开发(Spring框架详解)
- csky libmad库比mips慢
- c++ upcasting