C++八股--6--mysql 日志与并发控制
这里向大家介绍一下数据库基础:共分为以下章节
10前序.日志系统
这是数据库的核心。我放到首页来介绍,给大家一个前置概念,方便进行更好的学习
日志文件我们用来记录事务对数据库更新操作的文件,分为以记录为单位的文件和数据块为单位的文件
1.以记录为单位:每条记录包含 事务标识,操作类型,操作对象,更新前的值,更新后的值。
2.以数据块为单位:包含事务标识,被更新的数据块。
note:必须先写日志文件,再写数据库:不然你出故障找谁去
日志文件我们用到的为以下几种
1.undo log 回滚日志
实现事务原子性和多版本并发控制(MVCC)的核心机制,主要记录事务修改前的数据状态,方便回滚
主要作用
事务回滚:当事务失败或主动执行rollback的时候,利用undo log使其恢复到修改前状态
一致性读:为其它事务提供历史版本数据,避免读写冲突
崩溃恢复
工作原理:
每次事务修改前,都会将原始数据复制到undo log
版本链:同一行数据的多次修改会形成版本链,通过事务ID和指针串联历史版本
2.redo log 重做日志
确保事务的持久性,记录物理数据页的修改
这里解释一下原因,学过操作系统的朋友都知道,存储都是以块为单位的,但是我们不能因为这个阻塞进程吧
那么我们就通过redo log记录修改,如果内存向磁盘中还未写完就发生故障(如果正常完成会给个信号的)
那么依靠redo log,我们就可以再次进行写
作用:数据库重启,通过redo log重放未刷盘的数据
3.slow query log 慢查询日志
优化mysql 必不可少的日志,记录执行超过用户设定时间的语句
10.数据库恢复技术
数据库恢复技术说白了就是事务
10.1 事务定义:首先需要理解一下什么是事务
一个数据库操作序列
一个不可分割的工作单位
恢复和并发控制的基本单位
通俗来说:就是一组数据库操作叫做事务
语法:共有三个关键字:begin transaction, commit, rollback
事务特性:ACID
原子性:atomicity :数据库中列不可再分
一致性:consistency :确保一致性:我给你转50,你那边必须加五十,达成总数一致
隔离性:isolation 这个是重点,会有专门的章节介绍
持久性:durability 利用redo log确保修改成功
在现实生活中,故障是不可避免的,如果银行系统故障给你发了一百万,那银行肯定是不愿意的
那么对于数据库故障状态恢复到某一已知的正确状态就显得尤为重要
那么故障都有什么:事务内部故障,系统故障,介质故障,计算机病毒
对于事务内部的故障:由于事务语句逻辑错误造成
我们通常使用undolog(回滚日志)来解决,还是那句话:mysql的核心是日志
对于系统故障:通常未造成系统停止运转的任何事件,使得系统需要重新启动
恢复策略,1.事务未提交,还是undo log
2.事务已经提交,那么就是redo log
介质故障:就是硬件发生故障了
恢复策略:装入数据库发生介质故障前某个时刻的副本(就是备份然后恢复)
重做自此时开始的所有成功事务,将这些事务已经提交的结果重新记入数据库
讲道理:这不就是备份重做吗
计算机病毒:这个就比较抽象,类型很多,啥都能干
数据库恢复:说白就是数据转储(备份),日志(这个是核心,喷不了)
那说到备份,这里介绍一下吧
转储就是将DBA复制一份到磁带或者另一个磁盘保存起来
数据库遭到破坏可以将后备副本重新装入
转储分为静态和动态
1.静态
在系统无运行事务的时候进行的操作(静态都这样)
转储开始时处于事务一致性状态(最起码要保证数据库是正确的吧,不然我复制干嘛)
期间不允许对数据库任何存取,修改(联想打开文件无法复制)
2.动态
转储操作和用户事务并发运行
转储期间允许修改和存取
动态不能确保副本中数据正确有效
动态转储进行故障恢复:需要把动态转储期间各事务对数据库修改操作活动记录下来,建立日志文件(不愧是核心,哪里都有)
海量转储:每次全部存储
增量存储:只存储上次转储后更新过的数据
11.并发控制
在数据库的实际使用中,我们不得不考虑多线程下的数据库并发
也就是多个事务共同运行带来的问题
这里出现的问题分为以下三种:
1.脏读(这个在实际中是不被允许的):一个事务读取了另一个未提交事务修改的数据,然后另一个事务rollback
2.幻读:同一个事务多次查询同一范围内的数据,结果集的行数不同(别的事务插入或者删除了数据导致,这个事务觉得自己眼睛花了,所以叫幻读)
3.不可重复读:同一事务多次读取同一数据,结果不一致
这里就要重提我们前文提到的事务的四大特性中的隔离性了,我们核心就是 锁+mvcc(多版本并发控制)了
这里我先简要介绍一下事务的隔离级别
1.读未提交:事务可以读取其他事务未提交的数据
2.读已提交:事务只能读取其他事务已提交的数据
3.可重复读:同一事务内多次读取同一数据的结果一致,即使其他事务修改并提交了该数据。
4.串行化:所有事务按顺序执行,完全隔离(实际不考虑)。以上三种问题都可以避免
上述四种做法随着隔离级别的提高,效率也依次降低,(mysql默认工作在可重复读,oracle默认工作在读已提交)
那么既然谈到锁了,我们就介绍一下锁吧
锁在作用范围上分为表锁和行锁,表锁就是对表加锁(这实际上会造成效率低下),行级锁是mysql的innodb支持的锁,相较于表锁效率更高
事务执行对数据对象加锁,这样就会阻塞其余事务对其的操作
在类型上,锁分为排它锁和共享锁
排它锁(写锁 X锁):事务T对对象A上锁后,只允许T读取和修改A,其余事务不允许再加锁了,直到T释放锁
共享锁(读锁 S锁):事务T对对象A上锁后其余人也可以继续加X锁,但是不能加X锁,知道所有事务的锁释放
使用该机制S锁解决不可重复读的问题,我都不允许你改了,我肯定不能读到不同的数据了吧
该行可以不看:实际上mysql中我们的行级锁(又称为间隙锁)其根据索引锁住的为间隙
下面在介绍一些相关概念:
可串行化调度:多个事务并发执行时正确的,仅当其结果按照某一次序执行这些事务的结果相同
解释一下,就是多个事务语句交替执行的结果和按照顺序执行这些事务的结果一致
两段封锁协议:最常用的一种封锁协议,理论上证明使用两端封锁协议产生的为可串行化调度
事务分为两个阶段进行加锁和解锁
1.在对任何数据进行读写操作之前,需要获取对该数据的封锁
2.在释放一个封锁后,事务不在申请和获得任何其他封锁
最后介绍一下意向锁,
当使用表锁的时候,涉及到一个效率的问题。
当你想对一个表加锁的时候,最起码需要确定这张表没有被其它事务获取过X锁!这张表中的数据没有被获取过X锁!
这里就引入了意向共享锁和意向排他锁来解决效率问题,行锁导致效率降低
意向共享锁(IS):事务要对行加共享锁之前,需要先获取该表的IS锁
意向排他锁(IX):事务要对行加排它锁之前,需要先获取该表的IX锁
在实际上,意向锁时存储引擎自动加的,为表级锁,互相兼容
相关文章:
C++八股--6--mysql 日志与并发控制
这里向大家介绍一下数据库基础:共分为以下章节 10前序.日志系统 这是数据库的核心。我放到首页来介绍,给大家一个前置概念,方便进行更好的学习 日志文件我们用来记录事务对数据库更新操作的文件,分为以记录为单位的文件和数据块…...

DeepSeek实战--手搓实现Agent
1.背景 要学习AI agent,只会用agent 框架,还不够,一旦框架出现问题,没法快速的排查出问题。 学习就应该“知其然,更应该知其所以然” ,今天我们就用编码的方式实现一个简单的agent 。我们模拟一套AI学生评…...
Hutool的`BeanUtil.toBean`方法详解
BeanUtil.toBean是Hutool工具包中一个非常实用的JavaBean转换工具方法,它能够方便地将一个对象(通常是Map或另一个JavaBean)转换为目标类型的JavaBean实例。 方法签名 public static <T> T toBean(Object source, Class<T> tar…...

线性代数——行列式⭐
目录 一、行列式的定义⭐ 1-1、三阶行列式练习 1-2、下面介绍下三角行列式、上三角行列式、对角行列式 编辑 二、行列式的性质 2-1、性质1,2,3,4,5,6 编辑 2-2、性质7 2- 3、拉普拉斯定理、克莱姆法则 三…...

iPhone手机连接WiFi异常解决方法
iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…...
Spark缓存
生活中缓存容量受成本和体积限制(比如 CPU 缓存只有几 MB 到几十 MB),但会通过算法(如 “最近最少使用” 原则)智能决定存什么,确保存的是 “最可能被用到的数据”。 1. 为什么需要缓存? 惰性执…...
计算机视觉与深度学习 | 基于Transformer的低照度图像增强技术
基于Transformer的低照度图像增强技术通过结合Transformer的全局建模能力和传统图像增强理论(如Retinex),在保留颜色信息、抑制噪声和平衡亮度方面展现出显著优势。以下是其核心原理、关键公式及典型代码实现: 一、原理分析 1. 全局依赖建模与局部特征融合 Transformer的核…...

学习设计模式《八》——原型模式
一、基础概念 原型模式的本质是【克隆生成对象】; 原型模式的定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 。 原型模式的功能: 1、通过克隆来创建新的对象实例; 2、为克隆出来的新对象实例复制…...

疗愈服务预约小程序源码介绍
基于ThinkPHP、FastAdmin和UniApp开发的疗愈服务预约小程序源码,这款小程序在功能设计和用户体验上都表现出色,为疗愈行业提供了一种全新的服务模式。 该小程序源码采用了ThinkPHP作为后端框架,保证了系统的稳定性和高效性。同时,…...
如何通过外网访问内网?对比5个简单的局域网让互联网连接方案
在实际应用中,常常需要从外网访问内网资源,如远程办公访问公司内部服务器、在家访问家庭网络中的设备等。又或者在本地内网搭建的项目应用需要提供互联网服务。以下介绍几种常见的外网访问内网、内网提供公网连接实现方法参考。 一、公网IP路由器端口映…...
Linux 服务器静态 IP 配置初始化指南
✅ 第一步:确认网络管理方式 运行以下命令判断系统使用的网络管理服务: # 检查 NetworkManager 是否活跃 systemctl is-active NetworkManager# 检查 network(旧服务)是否活跃 systemctl is-active network或者检查配置路径&…...

【随笔】Google学术:but your computer or network may be sending automated queries.
文章目录 一、问题复述二、问题原因三、解决 前提:你的xxx是自己做的,你自己可以管理,而不是用的那些劣质✈场。 一、问题复述 🟢如下图所示:可以打开谷歌学术,但是一搜索就是这个界面。 二、问题原因 …...

长事务:数据库中的“隐形炸弹“——金仓数据库运维避坑指南
引言:凌晨三点的告警 "张工!生产库又告警了!"凌晨三点的电话铃声总是格外刺耳。运维团队发现数据库频繁进入单用户模式,排查发现某核心表的年龄值(Age)已突破20亿大关。经过一夜奋战,…...

ubuntu nobel + qt5.15.2 设置qss语法识别正确
问题展示 解决步骤 首选项里面的高亮怎么编辑选择都没用。如果已经有generic-highlighter和css.xml,直接修改css.xml文件最直接! 在generic-highlighter目录下找到css.xml文件,位置是:/opt/Qt/Tools/QtCreator/share/qtcreator/…...
优化01-统计信息
Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象(如表、索引、列等)的元数据信息,帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍: 一、统计信息的分类 表统…...

Unity-Socket通信实例详解
今天我们来讲解socket通信。 首先我们需要知道什么是socket通信: Socket本质上就是一个个进程之间网络通信的基础,每一个Socket由IP端口组成,熟悉计网的同学应该知道IP主要是应用于IP协议而端口主要应用于TCP协议,这也证明了Sock…...

MATLAB仿真定点数转浮点数(对比VIVADO定点转浮点)
MATLAB仿真定点数转浮点数 定点数可设置位宽,小数位宽;浮点数是单精度浮点数 对比VIVADO定点转浮点 目录 前言 一、定点数 二、浮点数 三、定点数转浮点数 四、函数代码 总结 前言 在FPGA上实现算法时,相比MATLAB实现往往需要更长的开发…...
配置Jupyter Notebook环境及Token认证(Linux服务器)
配置Jupyter Notebook环境及Token认证(Linux服务器) 背景 在Ubuntu 18.04.6 LTS服务器(IP: 39.105.167.2)上,基于虚拟环境pytorch_env,通过Mac终端(SSH)配置Jupyter Notebook环境&…...

【计算机网络】Cookie、Session、Token之间有什么区别?
大家在日常使用浏览器时可能会遇到:是否清理Cookie?这个问题。 那么什么是Cookie呢?与此相关的还有Session、Token这些。这两个又是什么呢? 本文将对这三个进行讲解区分,如果对小伙伴有帮助的话,也请点赞、…...

SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用
SpringCloud中Nacos服务注册中心 LoadBalancer服务负载均衡使用 前言Nacos工作流程nacos安装docker安装window安装 运行nacos微服务集成nacos高级特性1.服务集群配置方法效果图模拟服务实例宕机 2.权重配置3.环境隔离 如何启动集群节点本地启动多个节点方法 LoadBalancer集成L…...
Spring AI 集成 DeepSeek V3 模型开发指南
Spring AI 集成 DeepSeek V3 模型开发指南 前言 在人工智能飞速发展的当下,大语言模型不断推陈出新,DeepSeek AI 推出的开源 DeepSeek V3 模型凭借其卓越的推理和问题解决能力备受瞩目。与此同时,Spring AI 作为一个强大的框架,…...

Apache Doris 使用指南:从入门到生产实践
目录 一、Doris 核心概念 1.1 架构组成 1.2 数据模型 二、Doris 部署方式 2.1 单机部署(测试环境) 2.2 集群部署(生产环境) 三、数据操作指南 3.1 数据库与表管理 3.2 数据导入方式 3.2.1 批量导入 3.2.2 实时导入 3.…...

26届秋招收割offer指南
26届暑期实习已经陆续启动,这也意味着对于26届的同学们来说,“找工作”已经提上了日程。为了帮助大家更好地准备暑期实习和秋招,本期主要从时间线、学习路线、核心知识点及投递几方面给大家介绍,希望能为大家提供一些实用的建议和…...

拷贝多个Excel单元格区域为图片并粘贴到Word
Excel工作表Sheet1中有两个报表,相应单元格区域分别定义名称为Report1和Report2,如下图所示。 现在需要将图片拷贝图片粘贴到新建的Word文档中。 示例代码如下。 Sub Demo()Dim oWordApp As ObjectDim ws As Worksheet: Set ws ThisWorkbook.Sheets(&…...
Kafka消息队列之 【消费者分组】 详解
消费者分组(Consumer Group)是 Kafka 提供的一种强大的消息消费机制,它允许多个消费者协同工作,共同消费一个或多个主题的消息,从而实现高吞吐量、可扩展性和容错性。 基本概念 消费者分组:一组消费者实例的集合,这些消费者实例共同订阅一个或多个主题,并通过分组来协调…...

【Bluedroid】蓝牙 SDP(服务发现协议)模块代码解析与流程梳理
本文深入剖析Bluedroid蓝牙协议栈中 SDP(服务发现协议)服务记录的全生命周期管理流程,涵盖初始化、记录创建、服务搜索、记录删除等核心环节。通过解析代码逻辑与数据结构,揭示各模块间的协作机制,包括线程安全设计、回…...

中国自动驾驶研发解决方案,第一!
4月28日,IDC《中国汽车云市场(2024下半年)跟踪》报告发布,2024下半年中国汽车云市场整体规模达到65.1亿元人民币,同比增长27.4%。IDC认为,自动驾驶技术深化与生成式AI的发展将为汽车云打开新的成长天花板,推动云计算在…...

Kubernetes(k8s)学习笔记(四)--入门基本操作
本文通过kubernetes部署tomcat集群,来学习和掌握kubernetes的一些入门基本操作 前提条件 1.各个节点处于Ready状态; 2.配置好docker镜像库(否则会出现ImagePullBackOff等一些问题); 3.网络配置正常(否则即使应用发布没问题,浏…...

【项目篇之统一硬盘操作】仿照RabbitMQ模拟实现消息队列
统一硬盘操作 创建出实例封装交换机的操作封装队列的操作封装绑定的操作封装消息的操作总的完整代码: 我们之前已经使用了数据库去管理交换机,绑定,队列 还使用了数据文件去管理消息 此时我们就搞一个类去把上述两个部分都整合在一起&#…...
【基础复习笔记】计算机视觉
目录 一、计算机视觉基础 1. 卷积神经网络原理 2. 目标检测系列 二、算法与模型实现 1. 在PyTorch/TensorFlow中实现自定义损失函数或网络层的步骤是什么? 2. 如何设计一个轻量级模型用于移动端的人脸识别? 3. 描述使用过的一种注意力机制&#…...