数据库面试题——锁
创始人
2025-05-29 03:33:20
0

了解数据库的锁吗?

锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。

InnoDB下两种标准行级锁:

  • 共享锁(S Lock),允许事务读一行数据。

  • 排他锁(X Lock),允许事务删除或更新一行数据。

如果一个事务T1已经获得了行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,称这种情况为锁兼容。但若有其他的事务T3想获得行r的排他锁,则其必须等待事务T1、T2释放行r上的共享锁,这种情况称为锁不兼容。下图显示了共享锁和排他锁的兼容性,可以发现X锁与任何的锁都不兼容,而S锁仅和S锁兼容。需要特别注意的是,S和X锁都是行锁,兼容是指对同一记录(row)锁的兼容性情况。

意向锁:

  • 意向共享锁(IS Lock),事务想要获得一张表中某几行的共享锁。

  • 意向排他锁(IX Lock),事务想要获得一张表中某几行的排他锁。

由于InnoDB存储引擎支持的是行级别的锁,因此意向锁其实不会阻塞除全表扫以外的任何请求。故表级意向锁与行级锁的兼容性如下图所示。

死锁:

死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。若无外力作用,事务都将无法推进下去。

解决死锁问题最简单的一种方法是超时,即当两个事务互相等待时,当一个等待时间超过设置的某一阈值时,其中一个事务进行回滚,另一个等待的事务就能继续进行。

除了超时机制,当前数据库还都普遍采用wait-for graph(等待图)的方式来进行死锁检测。较之超时的解决方案,这是一种更为主动的死锁检测方式。InnoDB存储引擎也采用的这种方式。wait-for graph要求数据库保存以下两种信息:

  • 锁的信息链表;

  • 事务等待链表;

通过上述链表可以构造出一张图,而在这个图中若存在回路,就代表存在死锁,因此资源间相互发生等待。这是一种较为主动的死锁检测机制,在每个事务请求锁并发生等待时都会判断是否存在回路,若存在则有死锁,通常来说InnoDB存储引擎选择回滚undo量最小的事务。

介绍一下间隙锁

InnoDB存储引擎有3种行锁的算法,间隙锁(Gap Lock)是其中之一。间隙锁用于锁定一个范围,但不包含记录本身。它的作用是为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生。

InnoDB中行级锁是怎么实现的?

InnoDB行级锁是通过给索引上的索引项加锁来实现的。只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

当表中锁定其中的某几行时,不同的事务可以使用不同的索引锁定不同的行。另外,不论使用主键索引、唯一索引还是普通索引,InnoDB都会使用行锁来对数据加锁。

相关内容

热门资讯

【Vue3 基础篇】04.响应... 计算属性 computed Vue 提供的一种,用来描述复杂逻辑的响应式状态的 API:计算属性 A...
vue $get和$set方法 vue $get 和 $set 方法 $set方法 $set 方法用于添加响应式对象的属性ÿ...
《微机原理与接口技术》期末考试... 内容还会更新 微机原理只有理解了为什么,才可以真正记住这些代码怎么写,知...
【高阶数据结构】布隆过滤器和分... 文章目录1. 前置知识① 散列表② Hash函数③ 为什么要选择Hash④ 负载因子⑤ 解决哈希冲突...
css 背景渐变 序:本来用圆锥渐变画一个色盘的,后来想想要不要把背景渐变也总结一下&#x...
React 执行架构流程详细-... React 执行架构流程详细----归阶段 mount 时流程(三) 目...
mac删除文件夹它又自动恢复 ... 我们在使用电脑的过程中,需要不断地去清理电脑中不用或废弃的文件,从而保证...
Go Wails Docker... 文章目录1.背景2. 技术选型2.1 Wails2.2 Go2.3 Ant Design Vue3....
关于Anaconda安装后Sp... tensorflow1.14.0安装教程--保姆级_安装tensorflow1.14_星河欲转。的博...
(18)C#传智:HTML,属... 比较简单,无事的跳过,直接w3c.school 一、HTML简介  ...
ORBSLAM3 --- 地图... 目录 1.函数作用 2.函数流程 3.代码注释 4.代码解析 4.1 中止全局BA线程、局部建图线...
【MapGIS精品教程】012... 文章目录 一、DEM概述二、DEM建立1. 创建规则格网Grid2. 创建不规则三角网Tin 三、数...
Spring OpenFeig... 在前文,我们了解到feign实现负载均衡需要两个重要的接口: ILoad...
汽车电子的搬运工(AUTOSA... AUTOSAR开发技术手册 一、总体概述 AUTOSAR是Automotive Open Syste...
Selfish (Space ... Getting Started: Selfish (Space Edition) version 1...
idea中使用maven进行多... 引言 模块关系: A:代表父工程B:代表WEB模块&#x...
一篇博客教会你怎么使用Dock... 文章目录启动 Docker创建 Nginx 容器配置 Nginx 首先我们需要安装Docker&#...
STM32F407/ hk32... STM32F407/ hk32f030m 系统性能测试–dhrystone 一.MCU 基本情况 C...
BC95 低功耗的NB-IoT... BC95 是一款高性能、低功耗的NB-IoT 无线通信模块。其尺寸仅为19.9 × 23.6 × 2...
【入门4 数组】P5729 【... 【深基5.例7】工艺品制作 题目描述 现有一个长宽高分别为 w,x,hw,x,hw,x,h 组成的实...