MySQL数据库复习——事务

news2024/11/24 20:48:05

目录

一、什么是事务?为什么需要事务

二、事务的四大特性(ACID)

三、事务的使用

 四、并发带来的问题

1、脏读问题

2、不可重复读

3、幻读

五、MySQL的隔离级别


一、什么是事务?为什么需要事务

事务的概念:

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

举个例子:

小明和小红约好逃课去看英雄联盟总决赛。现在有三个步骤:

  1. 小明逃课
  2. 小红逃课
  3. 一起去看总决赛

但小明逃课出来等小红的时候,发现小红被老师逮住了,所以小明叹气地说:那还不如我不逃课,在教室上课呢!

此时事务地重要性就体现出来了,事务就是把这几个操作打包成一个整体,要么都执行成功,要么一步都不执行(结果要么我们去看了总决赛,要么我们都在教室上课),这就是事务的概念

二、事务的四大特性(ACID)

  • 原子性(automicity):事务中的若干操作要么全部执行成功,要么全不执行
  • 一致性(consistency):在事务开始之前和结束之后,数据库的数据都要合理合法
  • 隔离性(isolation):数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多个并发任务交叉执行导致数据不一致
  • 持久性(durability):事务一旦执行完毕,那么对于数据的修改就是持久生效的(存到磁盘)

事务的原子性如何保证:

原子性要求的是要么全不执行,要么执行成功,但在我们执行到某一个sql之前,我们是不知道它能否执行成功的,那么我们还如何保证原子性呢?

当出现执行失败时,由数据库执行”还原“操作,消除之前执行SQL带来的影响,对外而言就像从未执行一样!

这种”还原“操作就被称为”回滚“(rollback)

三、事务的使用

开启事务:

start transaction;

 执行SQL语句:

.............................

回滚或提交:

rollback/commit;

 

start transaction;
// transaction 与 commit 之间,就是事务中的若干操作
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

 四、并发带来的问题

并发编程是如今越来越流行的一种编程方式,并发式执行能够大大提升我们的代码运行速度

并发虽好,但可苦了数据库!!!

数据库在并发执行多个事务时,修改 / 读取的数据是同一个数据时就会出现问题。事务的隔离性就是为了解决以上问题,因此这里我们谈一下并发执行所带来的问题

1、脏读问题

 脏读是指在事务A在执行修改数据的操作时(事务A还没操作结束),另一个事务B读取了数据库的内容,此时事务B的读操作就是脏读。

举个例子:

A和B在同一个考场考试,B什么都不会,一直在瞅A的卷子,B抄的很开心,兴冲冲的交了卷子,就在这时,B发现A把卷子上的答案修改了,B留下了悔恨的眼泪~~

脏读的解决方法:

出现脏读的原因就是事务和事务之间没有任何隔离,那我们加上一些约束限制,就可以有效避免出现脏读——给写操作加锁,当一个事务在执行写操作时,其他事务没法执行读操作,当事务执行完毕后释放锁,其他事务才能读

2、不可重复读

不可重复读就是事务在执行过程中,多次读取到数据不相同

引用Dark And Grey大佬一张好图:

 不可重复读的处理方法:

首先思考不可重复读出现的原因——在另一个事务B执行读操作的同时,我们事务A还在修改数据,这就导致数据B在事务中每一次读到的数据是不一样的。那么处理方式就比较简单:在我读的时候,你不能修改。也就是给读操作上锁。

3、幻读

幻读就是事务A在执行过程中,多次读取的结果集不一样(数据总量不一样)虽然读操作和写操作都加锁了,但可以新增数据

引用Dark And Grey大佬一张好图:

 幻读的解决方法:

首先思考幻读出现的本质就是我们为了提升效率,在读者看我们第一篇博客的时候我们已经在卷第二篇博客了,所以解决的本质就是串行化执行,当读者在阅读我们的博客时,我们放弃写博客,直到读者读完。简单来说就是一个一个来,出来一个事务,解决一个事务。

这种执行方式的隔离性最高,但并发性最低,数据最可靠,速度很慢

常言道:鱼与熊掌不可兼得,隔离性和并发也是如此,又想执行速度快,又想隔离执行数据最准确,这是不可能的,我们必须在 ”快“ 和 ”准“ 之间找到一个平衡点。

五、MySQL的隔离级别

  1. read uncommited      允许读取未提交的数据,隔离性最低,并发性最高,存在脏读的问题
  2. read commited           只允许读取已提交的数据,对写操作加锁,隔离性提高了,并发性降低了,存在不可重复度和幻读
  3. repeatable read         给读操作也加锁了,这是MySQL 的默认隔离级别,解决了不可重复读,但存在幻读
  4.  serializable                严格的串行化执行,隔离性最高,解决了幻读问题

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

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

相关文章

深度解析Linux内核—中断

中断 中断是外围设备通知处理器的一种机制。 1. 中断控制器 外围设备不是把中断请求直接发送给处理器,而是发给中断控制器,由中断控制器转发给处理器。 不同种类的中断控制器的访问方法存在差异,为了屏蔽差异,内核定义了中断控…

model.eval 至关重要!!!!model.eval()是否开启 BN 和 Dropout 的不同

之前写过一个项目,eval的时候很正常,但是一infer就有问题,多次排查发现,原来就是只缺一个 model.eval()哇,重大教训,我debug好久,在小姑娘面前翻车… 🤣🤣🤣…

样本与抽样分布(2)-基本分布

本节介绍在数理统计中常用的几个基本分布。为此,先引进分位数定义。 定义1. 2. 1 设X为随机变量,则称满足 的为X的上侧分位数,简称为(上侧)分位数. 1 标准正态分布 标准正态分布N (0,1)是构造其他分布的基础,其密度函数为 它的图形关于y轴…

【毕业设计】深度学习卫星遥感图像检测与识别系统(目标检测)

文章目录0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后0 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对毕设的要求越来…

LeetCode-44-通配符匹配

1、递归 具体思路同LeetCode-剑指19-正则表达式匹配,但在本题中由于字符串长度过长会导致超时。 在这里插入代码片class Solution { public:bool isMatch(string s, string p) {if (p.empty()) return s.empty();bool first_match !s.empty() && (s[0] …

Gradle修改镜像库 ,初始启动配置 init.gradle

目录 ■前言 ■代码放置位置 ■具体代码 代码建议: ■Gradle 的 更多知识(私密) ■前言 默认镜像库太慢了,在【初始启动配置(init.d)】中,添加xxx.gradle (init.gradle) 文件,指…

网络自动化运维(NetDevOps)创作者推荐

前言: 随着NetDevOps技术登上了历史舞台,越来越多的从业者开始利用NetDevOps简化网络的运维,并进行了技术分享,将蛋糕越做越大。在这里,仅代表个人对这些无私奉献的网络、运维工程师们表达由衷的敬意。 此外&#xff…

用户身份验证的令牌—Token教程

一、什么是Token? 1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应…

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现

学习二十大奋进新征程线上知识答题小程序登录技术点分析与实现 在最新搭建的知识答题小程序,遇到了微信授权登录上的技术难点,所以对于以往的那套登录框架不能使用了,需要搭建一套新的注册登录流程框架。 不得不做出调整,为此&a…

json交叉编译并移植到嵌入式开发板

1、解压:tar -xvf json-c-0.9.tar.gz 默认解压在当前目录 2、进入解压后的目录:$ cd cd json-c-0.9/ 3、执行: sudo ./configure CCaarch64-linux-gnu-gcc --hostarm-linux --prefix/opt/json-c-0.9/ 说明:CC赋值为嵌入式开发环…

Java之线程详解(二)——线程安全概述、synchronized锁

一、线程安全概述 什么是线程安全问题? 当多个线程共享同一个全局变量,做写的操作时(即修改该全局变量),可能会受到其他的线程干扰,发生线程安全问题。 eg: public class Thread01 implemen…

丝裂原活化蛋白激酶TaMPK3抑制植物对ABA的反应

文章信息 题目:Mitogen-activated protein kinase TaMPK3 suppresses ABA response by destabilising TaPYL4 receptor in wheat 刊名:New Phytologist 作者:Ying Liu,You-Zhi Ma, Zhao-Shi Xu et al. 单位:Instit…

【Linux】如何在Linux下提交代码到gittee

文章目录使用 git 命令行创建项目三板斧第一招: git add三板斧第二招: git commit三板斧第三招: git push其他几个重要的命令git pull(将远端同步到本地)git rm(删除)git log(查看提交日志)使用 git 命令行…

GPT语言模型

GPT:GPT采用了大量的无监督的数据进行预训练(Pre-training),并在有监督的数据上进行微调(Fine-tuning)来做具体的NLP的任务。结构:GPT使用了12层12头,单向transformer的decoder部分&…

2001-2020年全国31省城镇居民人均可支配收入/居民实际收入水平

1、时间区间为:2001-2020年 2、范围包括:全国31省 3、基期:以2001年为基期 4、来源:国家统计J 5、指标包括: 城市居民消费价格指数(上年100)、城镇居民人均可支配收入(元)、实际可支配收入(2001年为基…

LabVIEW开发LabVIEW类

LabVIEW开发LabVIEW类 从概念上来说,LabVIEW面向对象编程和其它面向对象编程语言相似。但由于LabVIEW是数据流图形化编程环境,LabVIEW对类数据的操作和交互,以及LabVIEW类代码的调试方法和其它语言有所不同。 LabVIEW中的对象由值来传递&a…

02【SpringMVC的工作流程】

文章目录二、SpringMVC的工作流程2.1 SpringMVC的三大组件2.1.1 HandlerMapping:2.1.2 HandlerAdapter:2.1.3 ViewResolver:2.2 SpringMVC源码分析2.2.1 准备工作2.2.2 查看DispatcherServlet的继承体系:2.2.3 通过映射器获取执行…

工业机械设备设计与艺术设计

众所周知,外观设计是目前工业设计的一种,也是展示产品外观性能的最佳途径。如果外观设计做得好,产品可以在第一时间吸引顾客。说到外观设计,我们不得不说,工业机械的外观设计,因为机械工业是工业设计的主要…

Java客户关系系统(含源码+论文+答辩PPT等)

该项目采用技术Struts2代理注解反射MyBatisjqueryjscss等技术,项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍: 系统管理:用户登录、用户退出 员工管理:主要实现对员工的增、删、查、改功能 客户信…

ZMQ之面向服务的可靠队列(管家模式)

管家模式协议(MDP)在扩展PPP协议时引入了一个有趣的特性:client发送的每一个请求都有一个“服务名称”,而worker在像队列装置注册时需要告知自己的服务类型。MDP的优势在于它来源于现实编程,协议简单,且容易…