【MySQL】数据库事务详解

img

文章目录

  • 前言
  • 1. 事务的定义
  • 2. 事务的四个特性
    • 2.1 原子性
    • 2.2 一致性
    • 2.3 隔离性
    • 2.4 持久性
  • 3. 事务的并发问题
    • 3.1 脏读
    • 3.2 不可重复读
    • 3.3 幻读
    • 3.4 更新丢失
  • 4. 事务的隔离级别
  • 5. 事务的使用
  • 结语


前言

假设我们现在需要操作数据库进行转账,A 给 B 转账 100 块钱,我们就需要操作数据库,先扣除 A 账户 100 块钱, 再给 B 账户添加 100 块钱,这样才实现转账成功。但如果我们在扣除的过程中,服务器突然宕机了,那不就乱套了吗,A 发现自己钱少了,但 B 又没有收到钱。此时就需要事务来帮忙了


1. 事务的定义

事务指的是由一个或者多个数据库操作单元组成,相当于把多个 sql 语句打包成一个整体,这个整体就叫做事务,执行的时候,要么全部成功,要么全部失败,不可能存在部分执行成功部分执行失败的情况

这就是为什么事务能解决我们上面所遇到的转账失败场景:我们可以把整个转账过程所需要的 sql 语句组成一个事务,不会存在扣除 A 的账户上的钱而 B 账户的钱也没增加的情况了

那事务是怎么做到 “要么全部成功,要么全部失败” 的呢?究其内部原理,我们可以知道,当事务执行失败时,也就是在执行事务内部的 sql 语句时,数据库发现错误,那它就会自动还原成事务之前的状态,撤销之前的 sql,这样的机制也叫做 “回滚”(rollback)

为了实现回滚,数据库管理系统会记录事务的所有操作到日志中。如果需要回滚,系统会根据日志中的记录撤销操作,将数据库状态恢复到事务开始之前的状态


2. 事务的四个特性

事务的四个特性通常被称为ACID属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),它们共同确保了事务的可靠性和数据的一致性


2.1 原子性

原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何操作失败,整个事务将被回滚,将数据库状态恢复到事务开始之前的状态(最重要的特性)


2.2 一致性

一致性(Consistency):在事务开始之前和事务结束之后,数据库都必须处于一致的状态,即所有的数据都符合数据库的规则和约束


2.3 隔离性

隔离性(Isolation)并发执行的事务之间不会互相影响。每个事务都应该像在独立运行一样,即使多个事务同时进行,它们也应该彼此隔离,以避免数据不一致的问题


2.4 持久性

持久性(Durability):一旦事务被提交,它对数据库的改变就是永久性的。即使系统发生故障,已经提交的事务的结果也不会丢失

不同的数据库管理系统可能会根据ACID属性的不同实现方式,提供不同的性能和一致性保证


3. 事务的并发问题

在数据库系统中,当多个事务同时执行并尝试访问或修改相同的数据时,可能会遇到的一系列并发问题,下面就让我来一一介绍它们


3.1 脏读

脏读(Dirty Read)一个事务读取了另一个事务未提交的更改。如果那个事务最终回滚,那么读取的数据就是无效的

举个例子:现在有两个事务 T1 和 T2 并发执行,其中 T1 在针对某个表的数据进行修改,T1 在执行的过程中,T2 也去读这个表的数据,当 T2 读完后,T1 回滚了,这就导致 T2 读到的数据不是最终的“正确数据”,而是读到了临时的”脏数据“


3.2 不可重复读

不可重复读(Non-repeatable Read):当一个事务重新执行相同的查询,但是得到不同的结果,这是由于另一个事务在两次查询之间修改了数据并提交了更改

举个例子:现在有两个事务 T1 和 T2,T2 对某个表进行查询,得到第一次查询结果,T1 对该表的数据进行了修改,之后 T2 再次对表进行相同查询,但得到的查询结果和第一次不一样,这就是不可重复读


3.3 幻读

幻读(Phantom Read):当一个事务重新执行相同的查询,但是得到不同的数据集合(比如不同的行数),这通常是因为另一个事务插入或删除了一些行

举个例子:现在有两个事务 T1 和 T2,T1 在表中读取了一个字段,然后 T2 在同一个表中新增或者删除了一些数据,T1 再次读取该表时,就会发现多出或者少了几行数据,数据集不一样


3.4 更新丢失

更新丢失(Lost Update):两个或多个事务读取同一数据项,基于这个数据进行计算并尝试更新,如果这些更新几乎同时发生,一个事务的更新可能会覆盖另一个事务的更新


不可重复读和幻读的区别:

  • 不可重复读关注的是单个数据项的更改
  • 幻读关注的是数据集合整体的变化
  • 两者都是由于其他事务的介入导致的读取结果不一致,但不可重复读更侧重于单个数据项的层面,而幻读更侧重于数据的集合层面

4. 事务的隔离级别

因为在多个事务同时执行并尝试访问或修改相同的数据时,可能会遇到上面的脏读、不可重复读、幻读、更新丢失等问题,所以 MySQL 中提供了四种隔离级别来解决并发问题,它们按照提供的隔离保护从弱到强

  1. 读未提交(READ UNCOMMITTED):一个事务可以读取另一个事务未提交的数据,会出现脏读、不可重复读、幻读
  2. 读已提交(READ COMMITTED):一个事务只能读取另一个事务提交之后的数据,即给写操作加共享锁,但会出现不可重复读、幻读
  3. 可重复读(REPEATABLE READ):事务在整个过程中可以重复读取到相同的数据行,即给写操作和读操作都加锁,但会出现幻读
  4. 串行化(SERIALIZABILITY):事务将依次顺序执行,就像它们在一个没有并发的环境中一样,可以防止所有并发问题,包括脏读、不可重复读和幻读
隔离级别脏读不可重复读幻读
读未提交
读已提交X
可重复读XX
串行化XXX

从一到四的隔离级别,它们的事务隔离性逐渐增强,并行程度逐渐减弱,执行速度也逐渐减慢。在 MySQL 中,默认的隔离级别是可重复读


5. 事务的使用

-- 开启事务
start transaction;

-- 执行多条 SQL 语句

-- 回滚或者提交(rollback 是全部失败,commit 是全部成功)
rollback / commit;

要注意:回滚机制是针对事务这一操作,我们不能把 drop database 这种危险操作也回滚回来


结语

事务保障了数据库的数据完整性和一致性,而且还能通过隔离级别来处理并发问题,同时它也支持我们进行更加复杂的业务需求,掌握事务对我们来说十分有必要,本篇博客中对于事务的具体操作介绍还不够详细,之后博主会更加深入地学习事务,再进行补充

希望大家能够喜欢本篇博客,有总结不到位的地方还请多多谅解。若有纰漏,希望大佬们能够在私信或评论区指正,博主会及时改正,共同进步!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…

6.26作业

1.整理思维导图 2.统计家目录下.c文件的个数 ls ~/*.c | wc -l 3.终端输入一个.sh文件,判断文件是否由可执行权限,如果有可执行权限运行脚本,没有可执行权限添加可执行权限后,再运行脚本 #!/bin/bash read -p "请输入一个.…

Go语言学习:每日一练1

Go语言学习:每日一练1 目录 Go语言学习:每日一练1变量声明函数定义流程控制 ifrange遍历switch 变量声明 package main//定义变量 var a 1 const Message “hello,world”func main() {b : 2 //短变量声明var c 3c TestMethod(a, b, c)} //定义函数…

基于IM948(Low-cost IMU+蓝牙)模块的高精度PDR(Pedestrian Dead Reckoning)定位系统 — 可以提供模块和配套代码

一、背景与意义 行人PDR定位系统中的PDR(Pedestrian Dead Reckoning,即行人航位推算)背景意义在于其提供了一种在GPS信号不可用或不可靠的环境下,对行人进行精确定位和导航的解决方案。以下是关于PDR背景意义的详细描述&#xff1…

【课程总结】Day11(中):手势图像识别实战(Vgg16和ResNet)

前言 在上一章《【课程总结】Day11(上):手势图像识别实战(LeNet模型)》课程中,我们通过使用LeNet模型实现了手势识别。在本章内容中,我们将搭建Vgg模型和ResNet模型,并应用到手势识别中。 Vgg模型 Vgg简…

egg代码生成器

今天给大家分享一下egg的代码生成器,这个其实原理很简单,说白了就是用到了nodejs的一个文件io的操作,通过一系列配置参数解析然后生成一个很长的字符串,写入到文件中,最后导出到我们指定的文件夹。 前提概要 为什么我…

网工内推 | 国企信息工程师,信息系统项目管理师优先,最高14薪

01 上海浦东软件园股份有限公司 🔷招聘岗位:信息化管理工程师 🔷岗位职责: 1. 根据公司战略、数字化总体架构规划和IT 技术趋势,制定信息化系统的规划与设计,并制定实施计划。 2. 统筹公司信息化系统管理…

【Linux详解】进程的状态 | 运行 阻塞 挂起 | 僵尸和孤儿状态

目录 操作系统中 运行状态 阻塞状态 进程状态转换 Linux系统中 查看进程状态 深度睡眠状态 T 暂停状态 Z 僵尸状态 孤儿状态 文章手稿 xmind: 引言 介绍系统中的进程状态及其管理方式。将通过结合操作系统原理和实际代码示例,详细说明进程的各种状态、转换…

Java Stream API揭秘:掌握List流操作,打造高效数据处理流程

序言 Java Stream API是Java 8中引入的一个非常重要的功能组成部分,它提供了一种声明式的处理数据集合的方法。它主要特点是基于函数式编程的理念,允许我们以更加简洁、高效的方式进行集合的处理、转换和过滤。通过Stream API,我们可以灵活地…

暗黑4PTR怎么参与测试 暗黑4第五赛季怎么参加PTR测试教程

暗黑破坏神4作为暗黑破坏神系列的最新作品,自从2023年上线就受到了一众好评。游戏是动作冒险类角色扮演游戏,游戏的背景设定在一个腐化的圣休瑞亚大陆上,玩家们可以五种职业中选择自己喜爱的游戏进行游戏。 暗黑破坏神4第五赛季现在已经开启P…

机器学习数学原理专题——线性分类模型:损失函数推导新视角——交叉熵

目录 二、从回归到线性分类模型:分类 3.分类模型损失函数推导——极大似然估计法 (1)二分类损失函数——极大似然估计 (2)多分类损失函数——极大似然估计 4.模型损失函数推导新视角——交叉熵 (1&#x…

SpringCloud_GateWay服务网关

网关作用 Gateway网关是我们服务的守门神,所有微服务的统一入口。 网关的核心功能特性: 请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务&a…

Python数据分析-糖尿病数据集数据分析

一、研究背景介绍 糖尿病是美国最普遍的慢性病之一,每年影响数百万美国人,并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病,其中个体失去有效调节血液中葡萄糖水平的能力,并可能导致生活质量和预期寿命下降。。。。糖尿…

如何借助物联网实现土壤监测与保护

如何借助物联网实现土壤监测与保护 高标准农田信息化是指利用现代信息技术,如物联网、大数据、云计算等,对农田进行数字化、智能化的管理,以提高农田的生产效率和可持续发展能力。其中,土壤监测与保护是农田信息化的重要内容之一…

解决SD卡被写保护问题

存储卡在使用过程中,有时会遇到写保护问题,导致无法写入或删除数据。这可能会对用户的正常使用造成困扰。MK米客方德将为您介绍几种常见的解决方法,帮助用户解除存储卡的写保护。 一、检查物理写保护开关 许多存储卡,如SD卡&…

JavaScript的学习之dom的查询(一)

一、获得元素 通过document对象调用&#xff1a; getElementById()&#xff1a;通过id属性获取一个元素节点对象getElementsByTagName()&#xff1a;通过标签名获取一组元素节点对象getElementsByName()&#xff1a;通过name属性来获取一组元素节点对象 核心学习代码 <scrip…

【UE5.3】笔记3-静态网格体,BSP

静态网格体组件 主要有两个属性 一个是静态网格体&#xff1a;对应的也就是模型&#xff0c;比如fbx&#xff0c;maya&#xff0c;obj等格式 一个是材质&#xff1a;由各种贴图、渲染设置等&#xff0c;比如unity里的shader BSP画刷&#xff1a; 打开放置Actor选项卡&#…

QT中子工程的创建,以及如何在含有库的子工程项目中引用主项目中的qt资源

1、背景 在qt中创建多项目类型,如下: CustomDll表示其中的一个动态库子项目; CustomLib表示其中的一个静态库子项目; MyWidget表示主项目窗口(main函数所在项目); 2、qrc资源的共享 如何在CustomDll和CustomLib等子项目中也同样使用 MyWidget项目中的qrc资源呢??? 直…

MySQL 7种Join的定义图解示范结果(所有join类型)

文章目录 MySQL 7种Join的定义&图解&示范&结果&#xff08;所有join类型&#xff09;基本知识笛卡尔积 建表&填充数据1-Join不带条件account筛选 1-Inner Join 内连接不带条件account相同where筛选玩点特殊的 2-Left Join 左连接不带条件account筛选 3-Right J…

神经网络学习8-反向传播

back propagation 拿到前面传回来的L对z的偏导&#xff0c;再分别算损失值对x和w的偏导 反向传播 前馈过程求局部梯度 反向传播 这里的loss&#xff08;wxb-y)^2,第一个关于b的偏导为2(wxb-y),第二个关于w的为2w(wxb-y)