当前位置: 首页 > news >正文

数据库面试题——锁

了解数据库的锁吗?

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

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都会使用行锁来对数据加锁。

相关文章:

  • MySQL:索引与事物
  • springboot Aspect切面
  • 【Python】P1 Python 基础语法
  • Windows Server 2022 中文版、英文版下载 (updated Mar 2023)
  • 智能灯泡一Homekit智能家居系列
  • Java设计模式(二)——工厂模式
  • 半入耳蓝牙耳机哪款好?音质好高性价比的半入耳式蓝牙耳机
  • Matter名词解释
  • 什么是 LuaJIT?为什么 Apache APISIX 选择了 LuaJIT?
  • Java实用类之String、StringBuffer、StringBuilder
  • Uploadifive 批量文件上传
  • 什么是语法糖?Java中有哪些语法糖?
  • 24. linux系统基础
  • 大数据现在找工作难么
  • SpringBoot快速整合SpringSecurity,新手都会的详细步骤
  • 10个最佳ES6特性 ES7与ES8的特性
  • angular组件开发
  • Apache Zeppelin在Apache Trafodion上的可视化
  • CEF与代理
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • in typeof instanceof ===这些运算符有什么作用
  • iOS 系统授权开发
  • java多线程
  • JS专题之继承
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • scala基础语法(二)
  • socket.io+express实现聊天室的思考(三)
  • tensorflow学习笔记3——MNIST应用篇
  • VUE es6技巧写法(持续更新中~~~)
  • 大主子表关联的性能优化方法
  • 前端面试题总结
  • 容器服务kubernetes弹性伸缩高级用法
  • 一份游戏开发学习路线
  • 用简单代码看卷积组块发展
  • AI算硅基生命吗,为什么?
  • Linux权限管理(week1_day5)--技术流ken
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ubuntu下安装kvm虚拟机
  • (11)MSP430F5529 定时器B
  • (2)(2.10) LTM telemetry
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (二)c52学习之旅-简单了解单片机
  • (图)IntelliTrace Tools 跟踪云端程序
  • (转)c++ std::pair 与 std::make
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *2 echo、printf、mkdir命令的应用
  • .chm格式文件如何阅读
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net Winform开发笔记(一)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET是什么
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken