MySQL事务学习笔记

news2024/9/30 1:39:27

事务就是保证一组数据库操作,要么全部成功,要么全部失败。事务的实现是在引擎层, 因此我们说的是InnoDB的事务。

为何需要事务?

比如有一个转钱的业务,A给B转100, 那么就是两条sql语句,一个是A的钱包减去100元,一个是B的钱包加100元。如果没有事务,A减少100元以后,mysql机器断电了,B加钱的操作没有执行,那么就会出现A少了钱而B没有加钱的情况。如果用了事务,在mysql重启的时候,通过log就会把A这100元加回去,保证了数据的可靠性。

事务的特点

ACID (Atomicity, Consistency, Isolation, Durability) 原子性,一致性,隔离性,持久性。

原子性: 多个数据库操作要么全部成功,要么全部失败。

一致性: 数据库在执行事务前后数据都是具有一致性的。比如A 300 元 B 300 元,这是一个一致性的数据,执行了转账后A 200 元 B 400元也是一致性数据, 但是A 200元 B 300元就不是一致性的,这是要避免的。

隔离性: 并发执行的事务不会相互影响,这个会受到不同隔离级别设置而产生影响。

持节性:事务提交后对数据库的更新是持久的,不能回滚,系统故障后也不会丢失数据。

实现事务上述能力的主要技术就是日志文件(redo log, undo log),锁和MVCC。

事务的原子性是通过undo log(回滚日志)实现的

事务的持久性是通过redo log 来实现的

事务的隔离性是通过(读写锁+MVCC)来实现的

事务的一致性是通过原子性,持久性,隔离性来实现的。

Redo log

mysql不是每次都把修改实时同步到磁盘,因为这会很慢,mysql会先把修改存到缓冲池里面(内存),然后才会用后台线程去把缓冲池的东西刷到磁盘里面。这就是WAL技术。

redo log记录的是新数据的备份,记录的是事务对数据页的修改,在事务提交以前,把Redo log持久化了就行,就算commit以后系统立刻断电,有redo log就可以恢复数据。

Undo Log

回滚日志,记录数据被修改前的信息,记录数据的逻辑变化,这样事务出现错误要回滚的时候就可以通过回滚日志来回滚之前的操作。

表锁,行锁,读写锁。

这个和多线程中概念是一样的。

两个事务同时修改同一行记录,获得锁的才能改,没获得锁的就得等获得锁的事务执行完成(commit 或者rollback)。

MVCC

事务开始的时候会有一个事务号,这个号是唯一存在的,叫做transaction Id, 严格递增。

表里面的每一行数据也是有多个版本的,每次事务更新数据的时候,都会生成一个新的数据版本。

并且把 transaction id 赋值给这个数据版本的事务 ID,记为 row trx_id

举个例子

一开始k的值是1,三个事务1,2,3分别修改k为2,3,4这时这三个事务还都没提交,row上也会先把这三次修改记录下来,箭头反着画是因为undo log记录的是修改之前的记录。

确定一下现在的状态是事务1,2,3依次修改k, 然后都没有提交。隔离级别是可重复读。

在这之后事务1去读k, 首先看到的是k=4 trx_id=3这个记录,发现trx_id比自己大,这就是不可读的,然后通过undo log读到k=3这次记录,也是不可以读的,再往前知道发现k=2这一行和自己的事务id一致,就读到了。隔离性就是这么做的。

原子性

简单来说原子性就是对了继续,错了回滚。

每条数据变更操作(insert/update/delete)操作都伴随一条undo log的生成,回滚日志必须先于数据持久化到磁盘上。

回滚就是在调用一条反向的sql语句,delete变insert, insert变delete, update的逆向update。

持久性

提交事务时,数据先写缓冲池,然后后台线程才会写到磁盘上。如果事务提交后缓冲池数据还没有写到磁盘,mysql断电了,那么数据就丢了。

所以mysql在提交事务前就要把redo log写到磁盘上,这样才能保证持久性。

这里有一点说明一下,事务没提交,也会把数据写到缓冲区然后刷到磁盘,就是上面那个图花的那种结构。

隔离性和隔离级别

当数据库上多个事务同时执行的时候,可能出现脏读,不可重复读,幻读的问题。隔离级别就可以解决这些问题。隔离的越强,效率就越低。

SQL的事务隔离级别包括了:

读未提交: 事务没提交,变更也能被其他事务看到。

读提交: 事务提交了,变更才会被其他事务看到。

可重复读: 一个事务执行过程中看到的数据,和这个事务启动时看到的数据是一致的,未提交的数据其他事务也是看不见的。

串行化: 读写锁,阻塞了就得等持有锁的事务执行完成。

举个例子, 假设这两个事务访问的都是同一个数据表的同一行数据的k1。k1的初始值是1

事务A

事务B

启动事务

启动事务

查询值k1,得到值1

查询k1,得到了值1

把k2改成2

查询k1 值v1

提交事务

查询k1 值v2

提交事务

查询k1 值v3

在不同的隔离级别下,V1,V2,V3的值是不同的。

读未提交:v1=2, v2=2, v3=2

读提交: v1=1 v2=2 v3=2 b事务提交了以后A事务才能看到。

可重复读: v1=1 v2=1 v2=2 事务A读到的数据是事务开始时候的数据。

串行化:事务B执行将1改成2时,这一行记录已经被A事务加锁 (行锁,读锁),B要修改需要得到写锁,所以就阻塞了,直到提交了以后A才会继续执行。v1=v2=1 v3=2

一致性

上面的原子性,持久性,隔离性做到了,一致性也就做到了。

事务如何保证转账业务

这里说一下我们开头提到的业务。流程是

start 事务

set A.balance = A.balance -100

set B.balance = B.balance +100

commit

在运行第二句的时候,mysql会先把redo log写到磁盘上,然后写缓冲区,缓冲区再往磁盘上刷数据。

在第三句之前第二句之前mysql断电了,这时要分情况

  1. redo log还没写,这就等于第二句没跑,不用恢复。

  1. redo log有了,缓冲区还没写断电了,这时这个redo log里面没有commit标记,说明这个事务没有正常完成,要回滚,根据redo log把数据改回去就可以了。

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

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

相关文章

Spring Boot 热部署(热加载)

idea 热部署作用&#xff1a;自动帮开发者重启 spring boot 项目&#xff0c;从而达到修改代码之后能够“实时”的看到最新的效果1.添加热部署框架支持<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</…

Spring和Spring Boot的区别

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;Spring和Spring Boot的区别 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: …

双目立体匹配(传统/深度)方法总结

双目立体匹配工作--2022年度总述投影几何标定单目标定双目标定校正立体匹配传统方法深度学习方法合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式总述 投影几何 标定 摄像机参数&#xff1a;一般一共15个相关参数&#xff1a; &#xff08;1&#xff09;外参数…

详解目前最火的自主泊车技术

/ 导读 /谈起目前的自动驾驶技术&#xff0c;民众们最为熟悉的一定是已经走入寻常百姓家的辅助驾驶功能。对比起L4甚至更高级别的自动驾驶&#xff0c;司机们更相信将方向盘能时刻掌握在自己手中&#xff0c;如果有突发情况可以及时地进行接管。而目前消费者已经能体验到的辅助…

prometheus安装及使用入门

文章目录前言一. prometheus介绍1.1 prometheus的起源2.1 prometheus的特点二. prometheus的安装2.1 实验环境2.2 安装前准备2.3 开始安装prometheus2.3.1 下载并解压prometheus server2.3.2 安装过程2.3.3 启动并查看端口2.3.4 打开浏览器查看图形界面总结前言 云原生四象限&…

【应用】SpringCloud -- Sentinel

SpringCloud -- SentinelSentinel 概述Sentinel 的安装与启动Sentinel 微服务创建Sentinel 规则流控规则热点规则熔断规则授权规则Sentinel 其他常用功能规则持久化自定义异常Sentinel 概述 sentinel 官方文档 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越…

三十五、Kubernetes1.25中Ingress使用

1、概述在上篇文章中我们详解销售了Ingress是什么、有什么用以及怎么安装&#xff0c;如果没有看的建议先看下&#xff0c;然后再来看这篇文章&#xff0c;上篇文章地址&#xff1a;https://blog.csdn.net/u011837804/article/details/128564606这篇文章我们用实际操作&#xf…

vs鼠标右键“管理NuGet程序包”无响应

其他C#开发问题参考我的&#xff1a;C#基础知识体系框架图&#xff0c;及起对应我发过的博客 问题&#xff1a;下载SharpDX的开源示例代码&#xff0c;鼠标右键无法正常打开NuGet下载依赖&#xff0c;而在本地自己创建的项目中可以正常下载 原因&#xff1a;缺少.sln文件 解决…

定时任务Demo总结(推荐最后一种)

方法一&#xff1a; 线程实现 Runnable 接口 Thread thread new Thread(new Runnable() {Overridepublic void run() {while (true) {SimpleDateFormat sdf new SimpleDateFormat("HH:mm:ss.SSS");String dateStr sdf.format(new Date());System.out.println(&quo…

1.【SpringBoot源码】如何搭建SpringBoot源码调试环境?

目录 一、环境安装要求 二、从github上将SpringBoot源码项目下载下来 三、将SpringBoot源码项目导入到IDEA中 四、编译构建SpringBoot源码项目 五、运行SpringBoot自带的sample 一、环境安装要求 IntelliJ IDEAJDK1.8Maven3.5以上 二、从github上将SpringBoot源码项目下载…

嵌入式开发者的选择——用RTOS,还是不用RTOS?

多年来&#xff0c;随着新技术的引入以及用户和应用程序的不同需求&#xff0c;嵌入式开发人员发生了变化。正如所有嵌入式东西一样&#xff0c;没有两次流程是相同的。然而&#xff0c;我们应对设计挑战的方式有一些共同之处。你总是从系统级别开始&#xff0c;需要从最终应用…

深入 ServiceWorker,消息推送,后台同步,一网打尽

上一章讲到了ServiceWorker的基础使用&#xff0c;但是它的功能不仅仅只有这些&#xff0c;还有很多很多&#xff0c;比如消息推送&#xff0c;后台同步&#xff0c;甚至还有WebRTC&#xff0c;这一章我们来进阶ServiceWorker。 前期准备 在开始之前&#xff0c;我们先做一下…

【分布式微服务】SpringBoot启动原理

一、SpringBoot启动类 SpringBootApplication(exclude DataSourceAutoConfiguration.class) public class PracticeApplication {public static void main(String[] args) {SpringApplication.run(PracticeApplication.class, args);} }二、源码解析 /*** Static helper that …

云原生安全方案介绍

方案介绍 安全狗云原生应用安全解决方案(CNAPP, Cloud-Native Application Protection Platform)采用主机安全Agent和安全容器相结合的技术&#xff0c;既落地了“安全左移”的概念&#xff0c;又能对云原生容器做全面保护&#xff0c;同时能灵活地跟容器编排体系相结合&#x…

map find/count源码分析

参考博客&#xff1a;c map find方法源码解析 众所周知&#xff0c;如果一个数据结构想作为map的key&#xff0c;则必须重载 operator < 否则编译将会报错。但是operator 则是不需要的。那么当查找某个key是否存在的时候&#xff0c;map内部是怎么实现的呢&#xff1f; 结…

1301738-40-8,Bis-maleimides-amine,双马来酰亚胺-氨基

一、基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;1301738-40-8中文名&#xff1a;三臂双马来酰亚胺-氨基&#xff0c;双马来酰亚胺-氨基&#xff0c;活性交联剂&#xff0c;异官能团三臂交联剂英文名&#xff1a;Bis-Maleimides amin…

【C语言进阶】柔性数组

目录一&#xff1a;柔性数组的特点二&#xff1a;柔性数组的使用三&#xff1a;模拟实现柔性数组在C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫做柔性数组成员 以下是柔性数组的两种写法&#xff1a; //写法一&#xff1a; struct S {int n…

Python笔记 · 鸭子类型 / Duck Typing

1. 问题的由来 我初次意识到鸭子类型在存在是在学习Sklearn时&#xff0c;在《Hands-On Machine Learing》一书的第二章&#xff0c;作者提供了一个自定义的Tansformer&#xff0c;使用自定义Transformer的好处在于&#xff1a;你既可以实现自己需要的数据处理逻辑&#xff0c…

【应用】SpringCloud -- Gateway

SpringCloud -- GatewayGateway 网关概述Gateway 的功能Gateway 核心概念Gateway 网关搭建Gateway 的配置及使用predicate 断言filter 过滤器GlobalFilter 全局过滤器Gateway 的几点问题过滤器执行顺序跨域问题Gateway 网关概述 Gateway 的功能 在微服务当中&#xff0c;有很…

PG15 pg_basebackup 代码解析

背景 先前 PG 版本 pg_basebackup 的代码较为复杂&#xff0c;pg_basebackup 在备份过程中做了很多事情&#xff0c;但这部分代码逻辑没有完全解耦&#xff0c;导致一个文件里包含了很多功能的逻辑&#xff0c;影响了代码的可读性和可修改性。 因此&#xff0c;PG 15 针对这部…