mysql相关基础知识篇(五)

news2024/11/23 21:29:46

1.MySQL 事务的四大特性说一下?

在这里插入图片描述

  • 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性:指在事务开始之前和事务结束以后,数据不会被破坏,假如 A 账户给 B 账户转 10 块钱,不管成功与否,A 和 B 的总金额是不变的。
  • 隔离性:多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。简言之,就是事务之间是进水不犯河水的。
  • 持久性:表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

2.那 ACID 靠什么保证的呢?

  • 事务的隔离性是通过数据库锁的机制实现的。
  • 事务的一致性由 undo log 来保证:undo log 是逻辑日志,记录了事务的 insert、update、deltete 操作,回滚的时候做相反的 delete、update、insert 操作来恢复数据。
  • 事务的原子性和持久性由 redo log 来保证:redolog 被称作重做日志,是物理日志,事务提交的时候,必须先将事务的所有日志写入 redo log 持久化,到事务的提交操作才算完成。
    在这里插入图片描述

3.事务的隔离级别有哪些?MySQL 的默认隔离级别是什么?

在这里插入图片描述
事务的四个隔离级别

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

MySQL 默认的事务隔离级别是可重复读 (Repeatable Read)。

4.什么是幻读,脏读,不可重复读呢?

  • 事务 A、B 交替执行,事务 A 读取到事务 B 未提交的数据,这就是脏读。
  • 在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。
  • 事务 A 查询一个范围的结果集,另一个并发事务 B 往这个范围中插入 / 删除了数据,并静悄悄地提交,然后事务 A 再次查询相同的范围,两次读取得到的结果集不一样了,这就是幻读。

不同的隔离级别,在并发事务下可能会发生的问题:
在这里插入图片描述

5.事务的各个隔离级别都是如何实现的?

读未提交

读未提交,就不用多说了,采取的是读不加锁原理。

  • 事务读不加锁,不阻塞其他事务的读和写
  • 事务写阻塞其他事务写,但不阻塞其他事务读;

读取已提交&可重复读

读取已提交和可重复读级别利用了ReadView和MVCC,也就是每个事务只能读取它能看到的版本(ReadView)。

  • READ COMMITTED:每次读取数据前都生成一个 ReadView
  • REPEATABLE READ :在第一次读取数据时生成一个 ReadView

串行化

串行化的实现采用的是读写都加锁的原理。

串行化的情况下,对于同一行事务,写会加写锁,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

6.MVCC 了解吗?怎么实现的?

MVCC(Multi Version Concurrency Control),中文名是多版本并发控制,简单来说就是通过维护数据历史版本,从而解决并发访问情况下的读一致性问题。关于它的实现,要抓住几个关键点,隐式字段、undo 日志、版本链、快照读&当前读、Read View。

版本链

对于 InnoDB 存储引擎,每一行记录都有两个隐藏列DB_TRX_ID、DB_ROLL_PTR

  • DB_TRX_ID,事务 ID,每次修改时,都会把该事务 ID 复制给DB_TRX_ID;
  • DB_ROLL_PTR,回滚指针,指向回滚段的 undo 日志。
    在这里插入图片描述
    假如有一张user表,表中只有一行记录,当时插入的事务 id 为 80。此时,该条记录的示例图如下:
    在这里插入图片描述
    接下来有两个DB_TRX_ID分别为100、200的事务对这条记录进行update操作,整个过程如下:
    在这里插入图片描述
    由于每次变动都会先把undo日志记录下来,并用DB_ROLL_PTR指向undo日志地址。因此可以认为,**对该条记录的修改日志串联起来就形成了一个版本链,**版本链的头节点就是当前记录最新的值。如下:
    在这里插入图片描述
    ReadView

对于Read Committed和Repeatable Read隔离级别来说,都需要读取已经提交的事务所修改的记录,也就是说如果版本链中某个版本的修改没有提交,那么该版本的记录时不能被读取的。所以需要确定在Read Committed和Repeatable Read隔离级别下,版本链中哪个版本是能被当前事务读取的。于是就引入了ReadView这个概念来解决这个问题。

Read View 就是事务执行快照读时,产生的读视图,相当于某时刻表记录的一个快照,通过这个快照,我们可以获取:
在这里插入图片描述

  • m_ids :表示在生成 ReadView 时当前系统中活跃的读写事务的事务 id 列表。

  • min_trx_id :表示在生成 ReadView 时当前系统中活跃的读写事务中最小的 事务 id ,也就是 m_ids 中的最小值。

  • max_trx_id :表示生成 ReadView 时系统中应该分配给下一个事务的 id 值。

  • creator_trx_id :表示生成该 ReadView 的事务的 事务 id
    有了这个 ReadView ,这样在访问某条记录时,只需要按照下边的步骤判断记录的某个版本是否可见:

  • 如果被访问版本的 DB_TRX_ID 属性值与 ReadView 中的 creator_trx_id 值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问。

  • 如果被访问版本的 DB_TRX_ID 属性值小于 ReadView 中的 min_trx_id 值,表明生成该版本的事务在当前事务生成 ReadView 前已经提交,所以该版本可以被当前事务访问。

  • 如果被访问版本的 DB_TRX_ID 属性值大于 ReadView 中的 max_trx_id 值,表明生成该版本的事务在当前事务生成 ReadView 后才开启,所以该版本不可以被当前事务访问。

  • 如果被访问版本的 DB_TRX_ID 属性值在 ReadView 的 min_trx_id 和 max_trx_id 之间,那就需要判断一下 trx_id 属性值是不是在 m_ids 列表中,如果在,说明创建 ReadView 时生成该版本的事务还是活跃的,该版本不可以被访问;如果不在,说明创建 ReadView 时生成该版本的事务已经被提交,该版本可以被访问。

如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本。如果最后一个版本也不可见的话,那么就意味着该条记录对该事务完全不可见,查询结果就不包含该记录。

在 MySQL 中, READ COMMITTED 和 REPEATABLE READ 隔离级别的的一个非常大的区别就是它们生成 ReadView 的时机不同。

READ COMMITTED 是每次读取数据前都生成一个 ReadView,这样就能保证自己每次都能读到其它事务提交的数据;REPEATABLE READ 是在第一次读取数据时生成一个 ReadView,这样就能保证后续读取的结果完全一致。

7.数据库读写分离了解吗?

读写分离的基本原理是将数据库读写操作分散到不同的节点上,下面是基本架构图:
在这里插入图片描述
读写分离的基本实现是:

  • 数据库服务器搭建主从集群,一主一从、一主多从都可以。
  • 数据库主机负责读写操作,从机只负责读操作。
  • 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。
  • 业务服务器将写操作发给数据库主机,将读操作发给数据库从机。

8.那读写分离的分配怎么实现呢?

将读写操作区分开来,然后访问不同的数据库服务器,一般有两种方式:程序代码封装和中间件封装。

  1. 程序代码封装
    程序代码封装指在代码中抽象一个数据访问层(所以有的文章也称这种方式为 “中间层封装” ) ,实现读写操作分离和数据库服务器连接的管理。例如,基于 Hibernate 进行简单封装,就可以实现读写分离:
    在这里插入图片描述
    目前开源的实现方案中,淘宝的 TDDL (Taobao Distributed Data Layer, 外号:头都大了)是比较有名的。

2. 中间件封装

中间件封装指的是独立一套系统出来,实现读写操作分离和数据库服务器连接的管理。中间件对业务服务器提供 SQL 兼容的协议,业务服务器无须自己进行读写分离。

对于业务服务器来说,访问中间件和访问数据库没有区别,事实上在业务服务器看来,中间件就是一个数据库服务器。

其基本架构是:
在这里插入图片描述

9.主从复制原理了解吗?

  • master 数据写入,更新 binlog
  • master 创建一个 dump 线程向 slave 推送 binlog
  • slave 连接到 master 的时候,会创建一个 IO 线程接收 binlog,并记录到 relay log 中继日志中
  • slave 再开启一个 sql 线程读取 relay log 事件并在 slave 执行,完成同步
  • slave 记录自己的 binglog

在这里插入图片描述

10.主从同步延迟怎么处理?

主从同步延迟的原因

一个服务器开放N个链接给客户端来连接的,这样有会有大并发的更新操作, 但是从服务器的里面读取 binlog 的线程仅有一个,当某个 SQL 在从服务器上执行的时间稍长 或者由于某个 SQL 要进行锁表就会导致,主服务器的 SQL 大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。

主从同步延迟的解决办法

解决主从复制延迟有几种常见的方法:

  • 写操作后的读操作指定发给数据库主服务器
    例如,注册账号完成后,登录时读取账号的读操作也发给数据库主服务器。这种方式和业务强绑定,对业务的侵入和影响较大,如果哪个新来的程序员不知道这样写代码,就会导致一个 bug。

  • 读从机失败后再读一次主机
    这就是通常所说的 “二次读取” ,二次读取和业务无绑定,只需要对底层数据库访问的 API 进行封装即可,实现代价较小,不足之处在于如果有很多二次读取,将大大增加主机的读操作压力。例如,黑客暴力破解账号,会导致大量的二次读取操作,主机可能顶不住读操作的压力从而崩溃。

  • 关键业务读写操作全部指向主机,非关键业务采用读写分离
    例如,对于一个用户管理系统来说,注册 + 登录的业务读写操作全部访问主机,用户的介绍、爰好、等级等业务,可以采用读写分离,因为即使用户改了自己的自我介绍,在查询时却看到了自我介绍还是旧的,业务影响与不能登录相比就小很多,还可以忍受。

参考书籍(访问密码: 6798):

深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明.pdf: https://url31.ctfile.com/f/40632231-735785515-c1ff5b?

高性能MySQL(第3版).pdf: https://url31.ctfile.com/f/40632231-735785459-780d3e?

SQL查询的艺术.pdf: https://url31.ctfile.com/f/40632231-735785297-8c1d65?

MySQL技术内幕 InnoDB存储引擎 第2版.pdf:https://url31.ctfile.com/f/40632231-735784839-1a2df2?

SQLite 权威指南.pdf: https://url31.ctfile.com/f/40632231-735784840-d76185?

MySQL必知必会.pdf:https://url31.ctfile.com/f/40632231-735784664-7f7ca8?

MongoDB权威指南.pdf:https://url31.ctfile.com/f/40632231-735784624-2dafdf?

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

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

相关文章

maven的pom.xml文件爆红,并且刷新maven无法下载依赖的解决方案

平时使用idea时,对于新手有时候会遇到一些比较尴尬的事情——依赖无法下载 分析一下,maven依赖无法下载有以下原因 (1)maven在项目中是否安装且环境变量是否配置成功 (2)maven依赖下载慢,考虑是…

Dubbo3入门实践,SpringBoot+Dubbo+Nacos+DubboAdmin

前言 学习Dubbo的过程中发现官网文章太过简单,而且没有提供完整的项目整合,导致入门门槛比较高,初学者不知从何下手。本文将在SpringBoot的基础上整合Dubbo,注册中心使用当下流行的Nacos,还将使用Dubbo-Admin来管理服务…

RationalDMIS 2020 叶片检测 -快速定义叶片截面线方法

1.快速定义叶片截面线方法 用多平面切割叶片CAD定义曲线的方法,用来快速定义叶片截面曲线;自定义多个平面,使用这些平面切割CAD,生成多个叶片曲线(BladeCurve):再将生成的叶片曲线(BladeCurve)自动打断为两个子曲线(Curve);上述所有生成的曲线(Curve)都会添加到元…

[附源码]Python计算机毕业设计Django常见Web漏洞对应POC应用系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

使用 Rainbond 搭建本地开发环境

在开发之前,你需要在本地安装各种开发工具和服务,比如:Mysql、Redis、Nacos 等等,我们都知道在个人电脑上安装这些服务相当的繁琐,可能会遇到很多问题,环境问题、依赖问题等等。 在需要团队协作业务联调的…

第十三章《集合》第5节:Map集合

List、Set和Queue都是Collection接口的子接口,因此从更高层次来说它们属于统一类型的集合。Map接口也代表一种集合,但它不是Collection子接口,因此它属于另一种类型的集合。Map用于保存具有映射关系的数据。映射关系的数据分为两部分,就好比电话本一样,如图13-20所示。 图…

运筹说 第82期 | 算法介绍之图与网络分析(二)

本期我们继续进行运筹学之图与网络分析算法的讲解,我们将对图与网络分析的基础知识进行一个简单的回顾,并介绍求解最大流问题和最小费用最大流的MATLAB和Python相关代码,以帮助大家利用工具快速求解最大流问题和最小费用最大流问题&#xff0…

Spring的Bean意义

一、Spring概述 1. Spring家族 官网:https://spring.ioSpring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。 2. Spring体系结构 ⑴. Spring Framework系统架构图 Spring Framework是Spri…

四、【React-Router5】样式丢失问题

文章目录1、先上结论2、修改上一节代码3、发现问题4、分析原因5、3个解决办法1、先上结论 public/index.html 中 引入样式时不写 ./ 写 / [ 常用 ]public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% [ 常用 ]使用 HashRouter 2、修改上一节代码 点击访问 上节代码&…

[附源码]SSM计算机毕业设计学生档案管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【错误 :Segmentation fault 】以及gdb调试 core duumped文件

core dumped文件(核心转储文件) 当进程意外终止,系统可以将该进程的地址空间的内容急终止的一些其它信息转储到核心转储文件 它的触发条件,当系统收到以下信号时就会产生coredumped文件。 SIGABRT :异常终止(abort)时…

野火FPGA进阶(1):基于SPI协议的Flash驱动控制

文章目录第48讲:基于SPI协议的Flash驱动控制0. 理论部分1. Flash全擦除实验key_filterflash_be_ctrlspi_flash_betb_flash_be_ctrltb_spi_flash_be2. Flash扇区擦除实验key_filterflash_se_ctrlspi_flash_se3. 数据读操作key_filteruart_txflash_read_ctrlspi_flash…

专注于元宇宙实际应用方案的企业

元宇宙的话题持续火热。国内互联网大厂正在加大对元宇宙相关技术和应用的研发,元宇宙正在逐步成为创新创业的主战场。企业元宇宙在教育、会展、文创、旅游、博物馆、文化艺术、娱乐、社交、版权、零售等等领域发力,增加客户对企业的认同。 也许未来只需一…

接口测试学习第一天

1. 接口 接口的定义:是指系统或组件之间的交互点,通过这些交互点可以实现数据的交互。(数据交互的通道) 接口的分类:硬件接口和软件接口;我们这里只关注软件层面的接口; 1.1 接口的类型 接…

LeetCode-28-找出字符串中第一个匹配项的下标

1、KMP算法$$ 解决本问题最简单的方法就是暴力穷举,思路简单但时间复杂度为O(m∗n)O(m*n)O(m∗n)。此处我们仅考虑最优的KMP算法,时间复杂度为O(mn)O(mn)O(mn)。 KMP算法的优化之处在于当我们对比haystackhaystackhaystack和needleneedleneedle时&…

[附源码]计算机毕业设计springboot基于Java酒店管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

亚马逊商品销售数据爬虫分析报告

家电产业和消费者升级悄然地展开。 市场的这种变化使消费者对家用电器的期望不再仅仅是一个简单的功能满足,而是更多的细节体验和技术创新。 通过洞察家用电器的消费特点,有利于确定市场的未来趋势,从而积极应对市场变化。 ▼ 我们围绕亚马逊…

AI智能视频技术在考古工作中的安防应用

文物考古关系着民族文化的传承、历史的记录与保留,工作意义重大。考古发掘工地由于面积大、区域多且分散,以及周边环境复杂,因此安全防护工作开展困难,整体的安全形势不容乐观。 一、考古现场安保面临问题:1、考古遗址…

K - Scholomance Academy Gym - 103202K

题目链接 题意:很长,读了很长时间才懂: 就是给一个物品评分,假设分数大于等于x,就将其判断为正数,否则判断为负数 这样判断肯定会出现一些误判,那么我们将判为负数的正数成为假正数&#xff0…

C. Set or Decrease(二分 + 有两个不确定情况如何二分)

Problem - 1622C - Codeforces 给你一个整数数组a1,a2,...,an和整数k。 在一个步骤中,你可以 选择某个索引i并将ai减少1(使aiai-1)。 或者选择两个索引i和j,将ai等于aj(使aiaj)。 为了使数组∑i1nai≤k的…