图解Mysql原理:深入理解事务的特性以及它的实现机制

前言

大家好,我是程序蛇玩编程。

Mysql中事务大家不陌生吧,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。那它具有哪些特性,如何实现的呢?接着往下看。

正文

事务的特性:

事务的基本特性主要为四种,原子性,一致性,隔离性,持久性,下面一一介绍:

1.原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么全部成功,要么全部失败。如果事务中的某个操作失败,整个事务将回滚(Rollback),撤销所有已执行的操作,返回到事务开始前的状态。

2.一致性:一致性状态是指数据库中的数据应满足所有预定义的规则和约束,例如实体完整性、参照完整性等。

3.隔离性:并发执行的事务之间不会相互影响,每个事务都感觉不到其他事务的存在。事务的隔离性有不同的级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

4.持久性:一旦事务被提交(Commit),它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

今天主要向大家介绍隔离性,他能解决什么问题呢? 假如事务没有隔离性的话,多个事务同时执行的时候就可能出现脏读、不可重复读、幻读的问题,于是就诞生了隔离性,它有如上述的四种隔离级别。

1.读未提交是指,一个事务可以读取到其他事务未提交的数据。

2.读提交是指,一个事务只能读取到其他事务已经提交的数据。

3.可重复读是指,它确保了一个事务在执行期间可以多次读取相同的数据集,而不会看到其他并发事务对这些数据所做的更改。

4.串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

其中"读提交"和"可重复读"较难理解,我举了一个例子如下图所示,假设数据表S只有一列,一行的值为1,两个事务按照时间顺序执行。

Snipaste_2024-12-25_14-14-58

我们来看看事务A在不同的隔离级别下,分别返回什么结果。

若隔离级别是"读提交",则a1是1,a2是2,事务B的更改在提交后才能被事务A看到,所以a3也是2。

若隔离级别是"可重复读",则a1,a2都是1,a3才是2,之所以a2是1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。

那如何做到事务看还是看不见的呢?

数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。而在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

事务隔离的实现:

在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

我们假设一个值从10被按顺序改成了11,12,13,在回滚日志(undolog)中有如下记录:

Snipaste_2024-12-25_14-29-44

当前值是 13,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 视图。视图 A、B、C 里面,这一个记录的值分别是 10、11、13,同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。

今日小结

今天简单给大家介绍了事务的四大特性,并用一个例子说明了不同隔离级别下事务查询返回的结果,最后述说了事务隔离的实现,讲到了回滚日志以及视图,下一期我们再会。很多八股文内容合集就来这哈。

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

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

相关文章

进行网页开发时,怎样把function()中变量值在控制台输出,查看?

在网页开发过程中&#xff0c;为了及时了解JavaScript中的function函数中的变量值&#xff0c;可以用控制台命令console.log()把变量的值在控制台输出&#xff0c;方便调试时对函数变量值进行了解。 看下面的一段示例&#xff1a; <!DOCTYPE html> <html> &l…

linux内核进程管理(1)——创建,退出

linux源码阅读——进程管理&#xff08;1&#xff09; 1. 进程的基本介绍1.1 linux中进程和线程的区别1.2 task_struct中的基本内容1.3 命名空间ns(namespace)命名空间结构图Linux 中的命名空间类型 1.4 进程标识符 2. 创建一个进程的流程2.1 CLONE宏2.2 创建进程系统调用1. do…

人像面部关键点检测

此工作为本人近期做人脸情绪识别&#xff0c;CBAM模块前是否能加人脸关键点检测而做的尝试。由于创新点不是在于检测点的标注&#xff0c;而是CBAM的改进&#xff0c;因此&#xff0c;只是借用了现成库Dilb与cv2进行。 首先&#xff0c;下载人脸关键点预测模型:Index of /file…

【Python】每隔一段时间自动清除网站上cookies的方法

我在写爬虫的时候&#xff0c;经常会因为点击浏览太多的页面&#xff0c;而导致很多的cookies累积。 虽然单个Cookie很小&#xff0c;但长期积累可能占用浏览器存储空间&#xff0c;导致浏览器运行变慢&#xff08;尤其对老旧设备&#xff09;。 而且Cookies&#xff08;尤其…

非隔离电源芯片WT5104

非隔离电源芯片WT5104 非隔离电源芯片 WT5104 介绍 WT5104 是一款超高效且高精度的非隔离降压开关电源恒压控制驱动芯片&#xff0c;在各类电源转换场景中提供5V辅助电源供电发挥着重要作用。 一、芯片特点 高集成度&#xff1a;内部集成 800V 功率 MOSFET&#xff0c;极大减…

基于 Python 的自然语言处理系列(83):InstructGPT 原理与实现

&#x1f4cc; 论文地址&#xff1a;Training language models to follow instructions with human feedback &#x1f4bb; 参考项目&#xff1a;instructGOOSE &#x1f4f7; 模型架构图&#xff1a; 一、引言&#xff1a;为什么需要 InstructGPT&#xff1f; 传统的语言模型…

零基础入门 Verilog VHDL:在线仿真与 FPGA 实战全流程指南

摘要 本文面向零基础读者,全面详解 Verilog 与 VHDL 两大主流硬件描述语言(HDL)的核心概念、典型用法及开发流程。文章在浅显易懂的语言下,配合多组可在线验证的示例代码、PlantUML 电路结构图,让你在 EDA Playground 上动手体验数字电路设计与仿真,并深入了解从 HDL 编写…

Kubernetes控制平面组件:API Server详解(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

云服务器存储空间不足导致的docker image运行失败或Not enough space in /var/cache/apt/archives

最近遇到了两次空间不足导致docker实例下的mongodb运行失败的问题。 排查错误 首先用nettools看下mongodb端口有没有被占用&#xff1a; sudo apt install net-tools netstat --all --program | grep 27017 原因和解决方案 系统日志文件太大 一般情况下日志文件不会很大…

爬虫学习——下载文件和图片、模拟登录方式进行信息获取

一、下载文件和图片 Scrapy中有两个类用于专门下载文件和图片&#xff0c;FilesPipeline和ImagesPipeline&#xff0c;其本质就是一个专门的下载器&#xff0c;其使用的方式就是将文件或图片的url传给它(eg:item[“file_urls”])。使用之前需要在settings.py文件中对其进行声明…

拒绝用电“盲人摸象”,体验智能微断的无缝升级

&#x1f31f; 为什么需要智能微型断路器&#xff1f; 传统断路器只能被动保护电路&#xff0c;而安科瑞智能微型断路器不仅能实时监测用电数据&#xff0c;还能远程控制、主动预警&#xff0c;堪称用电安全的“全能卫士”&#xff01;无论是家庭、工厂还是商业楼宇&#xff0…

如何优雅地为 Axios 配置失败重试与最大尝试次数

在 Vue 3 中&#xff0c;除了使用自定义的 useRequest 钩子函数外&#xff0c;还可以通过 axios 的拦截器 或 axios-retry 插件实现接口请求失败后的重试逻辑。以下是两种具体方案的实现方式&#xff1a; 方案一&#xff1a;使用 axios 拦截器实现重试 实现步骤&#xff1a; 通…

【Leetcode刷题随笔】242.有效的字母异位词

1. 题目描述 给定两个仅包含小写字母的字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词。 字母异位词定义&#xff1a;两个字符串包含的字母种类和数量完全相同&#xff0c;但顺序可以不同&#xff08;例如 “listen” 和 “silent”&#xff09;。 …

示例:spring xml+注解混合配置

以下是一个 Spring XML 注解的混合配置示例&#xff0c;结合了 XML 的基础设施配置&#xff08;如数据源、事务管理器&#xff09;和注解的便捷性&#xff08;如依赖注入、事务声明&#xff09;。所有业务层代码通过注解简化&#xff0c;但核心配置仍通过 XML 管理。 1. 项目结…

Crawl4AI:打破数据孤岛,开启大语言模型的实时智能新时代

当大语言模型遇见数据饥渴症 在人工智能的竞技场上&#xff0c;大语言模型&#xff08;LLMs&#xff09;正以惊人的速度进化&#xff0c;但其认知能力的跃升始终面临一个根本性挑战——如何持续获取新鲜、结构化、高相关性的数据。传统数据供给方式如同输血式营养支持&#xff…

【机器学习-周总结】-第4周

以下是本周学习内容的整理总结&#xff0c;从技术学习、实战应用到科研辅助技能三个方面归纳&#xff1a; 文章目录 &#x1f4d8; 一、技术学习模块&#xff1a;TCN 基础知识与结构理解&#x1f539; 博客1&#xff1a;【时序预测05】– TCN&#xff08;Temporal Convolutiona…

Mysql--基础知识点--79.1--双主架构如何避免回环复制

1 避免回环过程 在MySQL双主架构中&#xff0c;GTID&#xff08;全局事务标识符&#xff09;通过以下流程避免数据回环&#xff1a; 1 事务提交与GTID生成 在Master1节点&#xff0c;事务提交时生成一个全局唯一的GTID&#xff08;如3E11FA47-71CA-11E1-9E33-C80AA9429562:2…

安宝特科技 | AR眼镜在安保与安防领域的创新应用及前景

随着科技的不断进步&#xff0c;增强现实&#xff08;AR&#xff09;技术逐渐在多个领域展现出其独特的优势&#xff0c;尤其是在安保和安防方面。AR眼镜凭借其先进的功能&#xff0c;在机场、车站、海关、港口、工厂、园区、消防局和警察局等行业中为安保人员提供了更为高效、…

Linux第十讲:进程间通信IPC

Linux第十讲&#xff1a;进程间通信IPC 1.进程间通信介绍1.1什么是进程间通信1.2为什么要进程间通信1.3怎么进行进程间通信 2.管道2.1理解管道2.2匿名管道的实现代码2.3管道的五种特性2.3.1匿名管道&#xff0c;只能用来进行具有血缘关系的进程进行通信(通常是父子)2.3.2管道文…

微信小程序通过mqtt控制esp32

目录 1.注册巴法云 2.设备连接mqtt 3.微信小程序 备注 本文esp32用的是MicroPython固件&#xff0c;MQTT服务用的是巴法云。 本文参考巴法云官方教程&#xff1a;https://bemfa.blog.csdn.net/article/details/115282152 1.注册巴法云 注册登陆并新建一个topic&#xff…