MySQL:事务

news2024/11/15 11:57:06

事务

在介绍事务之前,我们先来了解一个案例:

在一个买票的软件中,当客户端A检查还有一张票时,将票卖点,但是还没有更新数据库,客户端B检查了票数,发现大于0,于是又卖掉了一张票。然后A将票数更新回数据库,这样就出现了同一张票被卖了两次。

为了避免为了避免这样的情况出现,所以,就出现了事务。

目录

         什么是事务?

为什么会出现事务

隔离性、并发性

脏读

不可重复读

幻读


什么是事务?

事务就是一组DML语句,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败。比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。这样,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。概括一下就是,多条SQL语句打包在一起,成为了一个事物。

但是,如果一个事物在执行到一半的时候出错或者不再想继续执行了,那么已经执行的怎么办呢?所以,一个完整的事务,还需要满足以下几个属性:

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中 间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)(类似于电脑上的Ctrl+Z)到事务开始前的状态,就像这个 事务从来没有执行过一样。

原子性是事务的初心。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完 全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工 作。

一致性是事务要解决的问题、产生的结果。

 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务 并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交( Read uncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化 ( Serializable )。

与其对应的是并发性,我们平常会听说高并发等概念,其实就是说的这个并发性。数据库的隔离性越低,那么数据库的并发性就越高。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。事务产生的修改,都是会写入硬盘的,对于程序重启、主机重启、掉电等等,事务都可以正常工作,保证修改是生效。

为什么会出现事务

事务被 MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,,不需要我们去考虑各种各样的潜在错误和并发问题。可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?因此事务本质上是为了应用层服务的,而不是伴随着数据库系统天生就有的。

                        

隔离性、并发性

mysql服务器要同时给多个客户端提供服务,此时多个客户端之间,可能会同时发起事务,尤其是这多个事务在操作同一个数据库的同一个表的时候,就很有可能引起一些麻烦。

于是数据库的隔离性和并发性就引入进来,

如果隔离性越高,就意味着事务之间的并发程度越低。执行效率是越慢,但是数据的准确性是越高的。

如果隔离性越低,就意味着事务之间的并发程度越高。执行效率是越快,但是数据的准确性是越低的。

同时mysql给我们提供了不同的档位,可以控制隔离性/并发程度/执行效率/数据准确性的高低。

但是注意!隔离性越高,那么并发性就会降低,反之亦然,这两者是需要进行权衡的,如何取舍,需要根据实际需求,具体问题具体分析。

脏读

脏读:脏读就是读取未提交的数据。脏读指事务A读取到了事务B更新了但是未提交的数据,然后事务B由于某种错误发生回滚,那么事务A读取到的就是脏数据。

具体的说,一个数据原本是干净的,但是事务B将它进行修改使得其不再干净,此时事务A读取到事务B修改后的数据,也就是脏数据,称为脏读,后来事务B由于良心发现又将数据回滚为最初的样子,而事务A不知道事务B进行了回滚操作,最终事务A读取到的是脏数据,称为脏读。

例如:我在写一份代码,我的同学看到后把我的代码抄完了,但是我发现这个代码是错误的,于是我就把这份代码删除了。在这个场景中,我的同学和我的这俩事务,是完全并发的,没有任何限制。在这个场景下就会出现脏读问题。

如何解决:我写代码的时候,我不让我的同学来看,等我把代码上传后再允许他看。也就是说给我的代码加锁。也就是“写加锁”。我写的时候,同学就不能同时去读取了,这样就相当于降低了并发性,提高了隔离性,降低了一定的效率,但是提高了准确性。

不可重复读

不可重复读:前后多次读取,数据内容不一致!

不可重复读指在数据库访问时,一个事务在前后两次相同的访问中却读到了不同的数据内容。

比如说事务A的执行周期较长,事务A在第一次读取某个数据时,此数据的值为100,读取完成后,事务A又去执行其他的事情,在这个过程中,事务B将这个数据的值修改为200,然后事务A做完其他的事情后,又来读取这个数据的值,发现这个值和第一次所读取的值不相同,这种现象称为不可重复读。

如何解决:给读操作也加锁,别人在读代码的时候,我不能修改~这两个事物之间的并发程度进一步降低了,隔离性又进一步提高了。运行速度又进一步变慢了,数据的准确性又进一步提高了。

幻读

幻读:幻读指的是事务A在查询完记录总数后,事务B执行了新增数据的操作,事务A再次查询记录总数,发现两次查询的结果不一致,平白无故的多了几条记录,这种现象称为幻读。

如何解决:串行化,彻底舍弃并发。

幻读和不可重复读的本质是一样的,两者都表现为两次读取的结果不一致。但是不可重复读指的是两次读取同一条记录的值不同,而幻读指的是两次读取的记录数量不同。

不可重复读重点在于update和delete,而幻读的重点在于insert。

MySQL提供了四个隔离级别:

1.read uncommitted
不做任何限制 事务之间都是随意并发执行的 并发程度最高 隔离性最低 会产生脏读+不可重复读+幻读
2.read committed
对写操作加锁了 并发程度降低了 隔离性提高了 ―解决了脏读问题 仍然存在不可重复读+幻读
3.repeatable read(默认档位)
对写和读都加锁了 并发程度又降低了 隔离性又提高了 解决了脏读 不可重复读 可能存在幻读问题 
4.serializable
严格串行化 并发程度最低(串行执行的)隔离性最高 解决了脏读+不可重复读+幻读问题 执行速度最慢的

开发中可以根据当前要解决的问题的需求场景,来决定使用哪个级别。这一些级别通过MySQL的配置文件来修改。

在这里就有一个经典的面试问题:MySQL的四个隔离级别都是干啥的,可能产生的问题,以及每个问题的解决方案是什么~

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

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

相关文章

ROS:通信机制

目录 一、通信机制简介二、话题通信机制2.1话题通信简介2.2话题通信实操(C)2.2.1分析2.2.2发布方代码2.2.3订阅方代码2.2.4配置CMakeLists.txt2.2.5执行2.2.6注意 2.3话题通信实操(python)2.3.1分析2.3.2发布方代码2.3.3订阅方代码…

【计算机网络】第二章 物理层(上)

文章目录 2.1 物理层的基本概念2.2 物理层下面的传输媒体2.3 传输方式2.4 编码与调制2.4.1 介绍2.4.2 常用编码2.4.3 编码习题2.4.4 基本调制方法2.4.5 混合调制 2.1 物理层的基本概念 物理层考虑的是怎样在连接各种计算机的传输媒体上传输数据比特流。 物理层为数据链路层屏蔽…

4.0、Java_IO流 - 流的概念细分

4.0、Java_IO流 - 流的概念细分 按照流的方向分类: 输入流:数据流从数据源到程序(以 InputStream 、Reader 结尾的流); 输出流:数据流从程序到目的地(以 OutputStream 、Writer 结尾的流&#x…

【雕爷学编程】Arduino动手做(120)---游戏摇杆扩展板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

2023-06-23:redis中什么是缓存击穿?该如何解决?

2023-06-23:redis中什么是缓存击穿?该如何解决? 答案2023-06-23: 缓存击穿是指一个缓存中的热点数据非常频繁地被大量并发请求访问,当该热点数据失效的瞬间,持续的大并发请求无法通过缓存获取到数据&…

Triton教程 --- Triton 响应缓存

Triton教程 — Triton 响应缓存 Triton系列教程: 快速开始利用Triton部署你自己的模型Triton架构模型仓库存储代理模型设置优化动态批处理速率限制器模型管理自定义算子解耦后端和模型 概述 在本文档中,推理请求是模型名称、模型版本和输入张量(名称、…

ChatGPT从入门到精通,深入认识ChatGPT

ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作 全面AI时代就在转角 道路已经铺好了 “局外人”or“先行者” 就在此刻 等你决定1、ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视( 点击观看完整版本 )https…

TreeMap数据结构及源码解析.跟学黑马

TreeMap数据结构及源码解析 1.TreeMap的特点2.TreeMap的数据结构2.1二叉查找树2.1.1二叉查找树的定义2.1.2二叉查找树的查找操作 2.2平衡二叉树2.2.1平衡二叉树的定义2.2.2平衡二叉树的旋转 2.3红黑树2.3.1红黑树的定义 2.TreeMap的源码分析2.1get()获取方法分析2.2put()添加方…

企业级开发项目和自学项目到底有什么区别

前言 好久不见了各位!最近几个月都未更新,是因为从春招开始就在投简历面试实习岗位,然后入职,最后成功成为了一个半成品后端练习生,想说的话有太多太多 下面就站在一个在校实习生的身份,结合自己最近几个月…

科普 | 眼图

本文简要说明眼图相关的知识,参考是德科技的文章 1。 科普 | 眼图 基本知识串扰眼图眼图的产生原理及作用创建眼图 - 眼图波形的采样过程眼图的产生原理及作用眼图可以看出哪些性能指标?如何评判眼图质量?眼图测试模板眼图与存储深度实时的眼…

短视频seo源码开发部署技术解析

短视频seo开发需要哪些技术 应用程序优化技术:包括应用程序的各种元素(如标题、描述、关键字、图标等)的优化和设置,以及应用程序内部链接和导航的合理布局和设置。 视频内容优化技术:包括视频标题、描述、标签、封面…

人工智能数据集处理——数据获取

目录 1、从csv和txt文件中读取数据 pandas中可使用read_csv读取csv或txt文件中的数据 使用read_csv()函数读取phones.csv文件中的数据,并指定编码格式为gbk 使用head()方法指定获取phones.csv文件中前3行的数据 使用read_csv() 函数读取 itheima_books.txt文件中的数据,并指…

【Redis】2、Redis 的 Java 客户端(Jedis 和 SpringDataRedis)

目录 零、Redis 的 Java 客户端有哪些?二、Jedis 客户端(1) 引依赖(2) 连接 Redis 服务并测试(3) Redis 连接池 三、SpringDataRedis 介绍四、SpringBoot 中集成 SpringDataRedis(1) 引入依赖(2) 配置文件中书写相关配置(3) RedisTemplate 的默认序列化方式(4) 自定…

高校学生考勤系统

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括高校学生考勤系统的网络应用,在外国高校学生考勤系统已经是很普遍的方式,不过国内的高校学生考勤可能还处于起步阶段。高校学生考勤系统具有管理…

Linux网络-数据链路层,MAC帧解析,ARP协议

目录 数据链路层VS网络层 以太网概念 以太网的帧格式(报文格式)(也可以称之为MAC帧) MAC地址的概念 MAC帧格式 局域网通信原理 MTU MTU说明 MTU对IP协议的影响 MTU对UDP协议的影响 MTU对TCP协议的影响 ARP协议 ARP协…

【算法题解】41. 二叉树的中序遍历

这是一道 简单 题 https://leetcode.cn/problems/binary-tree-inorder-traversal/ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入&#…

[易语言][部署]使用易语言部署paddleocr的onnx模型api接口推理直接调用

易语言如何部署paddleocr模型,如今paddleocr模型广泛被使用各种编程,为了能在易语言上使用因此开发一个通用接口,开发基本思路如下: 可见我们并没有使用什么通信协议或者命令行之类的方法,这种直接封装接口比其他方法更…

TCP 学习笔记

Win R 打开控制台输入CMD 打开小黑窗, 输入ipconfig 查询本机地址 “外网IP是全世界唯一的IP地址,仅分配给一个网络设备。而内网IP是由路由器分配给每一部内部使用的IP地址,而内网的所有用户都是通过同一个外网IP地址进行上网的,而内网的IP地址每个人的都不一样…

(四)WPF - 布局

一、布局过程 WPF 布局包括两个阶段:一个测量阶段和排列阶段 在测量阶段,容器遍历所有子元素,并询问子元素它们所期望的尺寸。在排列阶段,容器在合适的位置放置子元素。(每个元素都被其父元素告知它自己的尺寸是多少…

【软件设计师暴击考点】下午题高频考点暴击系列

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…