C++八股--6--mysql 日志与并发控制

news2025/5/9 17:47:45

这里向大家介绍一下数据库基础:共分为以下章节

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锁

        在实际上,意向锁时存储引擎自动加的,为表级锁,互相兼容

        

    

        
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepSeek实战--手搓实现Agent

1.背景 要学习AI agent,只会用agent 框架,还不够,一旦框架出现问题,没法快速的排查出问题。 学习就应该“知其然,更应该知其所以然” ,今天我们就用编码的方式实现一个简单的agent 。我们模拟一套AI学生评…

线性代数——行列式⭐

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

iPhone手机连接WiFi异常解决方法

iPhone手机连接WiFi异常解决方法 一、问题现象二、iPhone连不上可能的原因三、基础排查与快速修复第一步:重启大法第二步:忽略网络,重新认证第三步:关闭“私有无线局域网地址”第四步:修改DNS服务器第五步:还原网络设置四、路由器端排查及设置关闭MAC地址过滤或添加到白名…

学习设计模式《八》——原型模式

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

疗愈服务预约小程序源码介绍

基于ThinkPHP、FastAdmin和UniApp开发的疗愈服务预约小程序源码,这款小程序在功能设计和用户体验上都表现出色,为疗愈行业提供了一种全新的服务模式。 该小程序源码采用了ThinkPHP作为后端框架,保证了系统的稳定性和高效性。同时&#xff0c…

【随笔】Google学术:but your computer or network may be sending automated queries.

文章目录 一、问题复述二、问题原因三、解决 前提:你的xxx是自己做的,你自己可以管理,而不是用的那些劣质✈场。 一、问题复述 🟢如下图所示:可以打开谷歌学术,但是一搜索就是这个界面。 二、问题原因 …

长事务:数据库中的“隐形炸弹“——金仓数据库运维避坑指南

引言:凌晨三点的告警 "张工!生产库又告警了!"凌晨三点的电话铃声总是格外刺耳。运维团队发现数据库频繁进入单用户模式,排查发现某核心表的年龄值(Age)已突破20亿大关。经过一夜奋战&#xff0c…

ubuntu nobel + qt5.15.2 设置qss语法识别正确

问题展示 解决步骤 首选项里面的高亮怎么编辑选择都没用。如果已经有generic-highlighter和css.xml,直接修改css.xml文件最直接! 在generic-highlighter目录下找到css.xml文件,位置是:/opt/Qt/Tools/QtCreator/share/qtcreator/…

Unity-Socket通信实例详解

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

MATLAB仿真定点数转浮点数(对比VIVADO定点转浮点)

MATLAB仿真定点数转浮点数 定点数可设置位宽,小数位宽;浮点数是单精度浮点数 对比VIVADO定点转浮点 目录 前言 一、定点数 二、浮点数 三、定点数转浮点数 四、函数代码 总结 前言 在FPGA上实现算法时,相比MATLAB实现往往需要更长的开发…

【计算机网络】Cookie、Session、Token之间有什么区别?

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

SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用

SpringCloud中Nacos服务注册中心 LoadBalancer服务负载均衡使用 前言Nacos工作流程nacos安装docker安装window安装 运行nacos微服务集成nacos高级特性1.服务集群配置方法效果图模拟服务实例宕机 2.权重配置3.环境隔离 如何启动集群节点本地启动多个节点方法 LoadBalancer集成L…

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(&…

【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模拟实现消息队列

统一硬盘操作 创建出实例封装交换机的操作封装队列的操作封装绑定的操作封装消息的操作总的完整代码: 我们之前已经使用了数据库去管理交换机,绑定,队列 还使用了数据文件去管理消息 此时我们就搞一个类去把上述两个部分都整合在一起&#…

基于 GO 语言的 Ebyte 勒索软件——简要分析

一种新的勒索软件变种,采用Go 语言编写,使用ChaCha20进行加密,并使用ECIES进行安全密钥传输,加密用户数据并修改系统壁纸。其开发者EvilByteCode曾开发过多种攻击性安全工具,现已在 GitHub 上公开 EByte 勒索软件。尽管该勒索软件声称仅用于教育目的,但滥用可能会导致严重…