MySQL~事务的四大特性和隔离级别
事务的四大特性
1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样,通过undo log实现。
2.持久性:事务处理结束后,数据库会把对数据的修改写到磁盘上,即便系统故障也不会丢失,保证了数据的持久性,通过redo logo来保证。
3.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以让不同的事务看到不同的数据内容,防止多个事务并发执行导致数据不一致的问题。通过MVCC多版本并发控制实现,用到了ReadView读视图和undo log里面的历史版本链。
4.一致性:指事务操作前后,是从一个一致性的状态到另一个一致性的状态,它是由原子性,持久性,隔离性来共同保证一致性的。
- 原子性保证一致性:比如说银行转账,一方扣钱一方加钱,两条SQL属于一个事务,为了保证双方金额的一致性,两条SQL必须同时执行成功,或者就都不执行,这就保证了前后数据的一致性。
- 持久性保证一致性:比如我买了一个月以后回家的飞机票,一个月后买票的数据没了,但是我钱也花了,这就导致了数据的不一致。数据库要保证一个月后我买票的数据还在,就是通过持久性来保证的。(把买票的数据保存到磁盘上去)
- 隔离性保证一致性:如果没有隔离性,一致性同样得不到保证。比如在统计考试成绩的时候,一个事务里面,两条SQL,一条统计所有科目的平均分,一条统计语数英三门课的平均分。如果没有隔离性,一开始数学是60分,平均分统计完后,数学被其他事务改成了100分,后一条统计语数英三门课的平均分的时候,使用的数学成绩就和之前的不一样了,这就导致了不一致性。所以需要隔离性来保证事务的一致性。
事务的隔离级别
事务并行时会出现的问题
脏读:一个事务读取到了另一个事物修改后但是还没有提交的数据,这就发生了脏读。此时如果你发生回滚,那我读到的就是过期的数据。
不可重复读:在一个事务内,多次读取同一个数据,发现读取到的数据不一样,就发生了不可重复读的情况。事务A第一次读的是时候是100,然后事务B把这个值修改成了200,然后提交,事务A再读的时候就变成200了,重复读数据但是读到的却是不同的值。
幻读:一个事务内多次统计符合某个条件的记录数量,发现前后统计的数量不一致。比如事务A一开始统计不及格的人数有3个,然后事务B插入了一个不及格的人员信息,提交了事务,此时事务A再查不及格的记录数就变成4个了。
隔离级别
- 读未提交(read uncommitted),指一个事务还没提交时,它做的修改就能被其他事务看到;
- 读提交(read committed),指一个事务提交之后,它做的修改才能被其他事务看到;
- 可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,我可以重复读,不会读取到不一样的数据。MySQL InnoDB 引擎的默认隔离级别;
- 串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
隔离级别越高,越不容易出问题,但是相对的效率也会更低。
- 在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;
- 在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;
- 在「可重复读」隔离级别下,可能发生幻读现象,但是不可能脏读和不可重复读现象;
- 在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。
如何实现隔离级别
- 读未提交:要读取到未提交的修改数据,所以直接读最新的数据就行。
- 串行化:通过加锁的方式实现
- 读提交和可重复读:通过MVCC(多版本并发控制)来实现的,用到了Undo log里面的历史版本链,还有ReadView读快照。(PS,准确一点还用到了几个隐藏字段,通过隐藏字段访问到历史版本链和最近修改记录的事务ID)
可重复读的是每次事务启动都生成一个ReadView,后续整个事务就使用这个ReadView。而读提交是每次读取数据的时候,会重新生成一个ReadView。
ReadView中有4个字段
- create_transaction_id,指创建该ReadView的事务id
- m_ids:当前活跃且未提交的事务列表
- min_transaction_id,当前活跃且未提交的事务列表中事务id的最小值
- max_transaction_id,创建ReadView时当前数据库中要分配给下一个事务的id。
然后每条记录里面还有两个隐藏字段,
- transaction_id表示最近一次修改该记录的事务id
- roll_pointer指针,指向undo log里面该记录的历史版本链,记录该记录被修改的不同版本,用链表的形式连接起来。
开始

当一个事务访问该记录的时候,首先获取最近修改该记录的事务id,就是transaction_id字段,然后获取到undo log历史版本链中的最新版本。
- 如果是自身,那当然允许访问
- 如果小于min_transaction_id,表示该版本在创建ReadView之前就创建了,固然允许访问。
- 如果大于max_transaction_id,表示该版本是在创建了ReadView之后才生成的,固然不允许访问,跳转到下一个历史版本
- 如果在min_transaction_id和max_transaction_id之间,则需要判断当前修改过该记录的事务有没有提交,提交了就可以访问,没有提交就不能访问。
可以查看transaction_id是否在m_ids列表中,如果在,说明该事务还在活跃,没有提交,就不能访问该版本;如果不在,说明该事务已经提交,固可以访问。
就经过这样一个过程,最终会找到当前事务可以访问的那个版本来访问。
相关文章:
MySQL~事务的四大特性和隔离级别
事务的四大特性 1.原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个…...
JMeter处理接口签名之BeanShell实现MD5加密
项目A需要给项目B提供一个接口,这个接口加密了,现在需要测试这个接口,需要怎么编写脚本呢?实现接口签名的方式有两种:BeanShell实现MD5加密和函数助手实现MD5加密,之前已经分享过了函数助手实现MD5加密&…...
【Golang】一文学完 Golang 基本语法
Golang 下载 安装包链接:https://share.weiyun.com/InsZoHHu IDE 下载:https://www.jetbrains.com/go/ 第一个 golang 程序 package mainimport "fmt"func main() {fmt.Println("hello golang") }每个可执行代码都必须包含 Pack…...
《Java-SE-第三十五章》之方法引用
前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…...
Effective Java笔记(33)优先考虑类型安全的异构容器
泛型最常用于集合,如 Set<E >和 Map<K ,V>,以及单个元素的容器 ,如 ThreadLocal<T>和 AtomicReference<T> 。 在所有这些用法中,它都充当被参数化了的容器 。 这样就限制每个容器…...
释放AI创作潜能:从大模型训练到高产力应用
文章目录 每日一句正能量前言什么是人工智能生成内容(AIGC)人工智能生成内容(AIGC)能做什么为什么要用人工智能生成内容(AIGC)创作成果用Java实现冒泡排序算法学生信息收集系统学生请假管理系统需求分析教务…...
Ajax 笔记(一)—— Ajax 入门
笔记目录 1. Ajax 入门1.1 Ajax 概念1.2 axios 使用1.2.1 URL1.2.2 URL 查询参数1.2.3 小案例-查询地区列表1.2.4 常用请求方法和数据提交1.2.5 错误处理 1.3 HTTP 协议1.3.1 请求报文1.3.2 响应报文 1.4 接口文档1.5 案例1.5.1 用户登录(主要业务)1.5.2…...
Android Studio跳过Haxm打开模拟器
由于公司权限限制无法安装Haxm,这个时候我们可以试试Arm相关的镜像去跳过Haxm运行模拟器。解决方案:安装API27以下的Arm Image. #ifdef __x86_64__if (sarch "arm64" && apiLevel >28) {APANIC("Avds CPU Architecture %s i…...
从一个GPU到多个GPU
在多GPU运行应用程序时,需要正确设计GPU之间的通信,GPU间数据传输的效率取决于GPU是如何连接在一个节点上并跨集群的 在多GPU系统里有两种连接方式 多GPU通过单个节点连接到PCIe总线上 多GPU连接到集群中的网络交换机上 /* * 本示例演示了如何使用 Open…...
小白编写一个Chrome
步骤 1:了解插件的基本结构和功能 首先,向小白解释什么是Chrome插件,它是如何工作的,以及它可以做什么。强调插件可以修改网页内容、添加功能等。 步骤 2:准备工作 安装Chrome浏览器:确保小白的计算机上…...
自然语言处理学习笔记(六)————字典树
目录 1.字典树 (1)为什么引入字典树 (2)字典树定义 (3)字典树的节点实现 (4)字典树的增删改查 DFA(确定有穷自动机) (5)优化 1.…...
WPF实战项目十一(API篇):待办事项功能api接口
1、新建ToDoController.cs继承基础控制器BaseApiController,但是一般业务代码不写在控制器内,业务代码写在Service,先新建统一返回值格式ApiResponse.cs: public class ApiResponse{public ApiResponse(bool status, string mess…...
ffmpeg给视频添加时间水印,准确且不模糊
ffmpeg -i {输入文件路径} -vf{drawtext} {输出文件路径} 针对视频模糊,加上 -b:v {输出视频码率};右键属性,可查看离线视频源码率; 针对离线视频文件加上时间水印,时间跳变不正常,加上-re; 整…...
① vue复习。从安装到使用
vue官网:cn.vuejs.org vue安装 cnpm install -g vue/cli 查看是否安装成功 vue --version 创建一个项目 vue create vue-demo(项目名称) 这个取消掉。空格可选中或者取消。 运行项目: cd 进入到项目下 npm run serve 运行成功后,访问这…...
【Linux】多线程——线程引入 | 线程控制
文章目录 一、Linux多线程1. 线程概念2. 线程创建3. 线程和进程4. 线程的优缺点 二、线程控制1. 线程创建2. 线程终止3. 线程等待4. 线程分离5. 线程局部存储 三、线程封装 一、Linux多线程 一级页表和二级页表都是key/val模型,一级页表的key是第一份的10个比特位&a…...
查询树形目录(内存遍历成树返回)
实体 Data TableName("dtp_sm_servicetype") ApiModel(value "SmServicetype对象", description "服务类型") EqualsAndHashCode(callSuper true) public class SmServicetype extends BaseEntity {ApiModelProperty("服务类型名称&quo…...
Easys Excel的表格导入(读)导出(写)-----java
一,EasyExcel官网: 可以学习一些新知识: EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 二,为什么要使用easyexcle excel的一些优点和缺点 java解析excel的框架有很多 : poi jxl,存在问题:非常的消耗内存, easyexcel 我们…...
纯净版ISO镜像下载大全(Windows、Linux、mac)
目录 一、前言介绍 前言必读 介绍 二、获取ISO镜像方式 (一)官方镜像下载 (二)获取下载方式 ps:回复的内容都是小写的 Windows操作系统 1.windows XP系统 2.Windows 7系统 3.Windows10系统 4.Windows11系…...
VMware上的Centos设置静态IP
服务器环境一般都是Centos7,而且很多软件在Linux环境上也能支持得更好,所以我需要在本机上使用虚拟机安装Linux,因为需要访问Linux上安装的软件,所以需要固定IP,不然每次更改也不方便。 基础环境准备 安装VMware在VM…...
【MySQL】数据库的基本操作
文章目录 1. 创建数据库1.1 创建数据库的语句1.2 创建一个数据库1.3 查看字符串与校验规则1.4 校验规则对数据库的影响 2. 删除数据库3. 查看数据库4. 修改数据库5. 备份与恢复5.1 数据库的备份与恢复5.2 表的备份与恢复 6. 查看数据库的连接情况 1. 创建数据库 1.1 创建数据库…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
