7-事务

news2024/12/23 22:16:22

目录

1.什么是事务?

2.为什么用事务?

3.事务怎么用?

4.事务的四大特性(ACID)

①原子性(Atomicity,又称不可分割性)

②一致性(Consistency)

③隔离性(重要)(Isolation,又称独立性)

④持久性(Durability)

5.MySQL 事务隔离级别有 4 种(重要)

①READ UNCOMMITTED(读未提交/未提交读)

②READ COMMITTED(读已提交/提交读)

③REPEATABLE READ(可重复读)(默认)

④SERIALIZABLE(序列化)

6.并发事务中的问题

a.脏读

b.不可重复读

c.幻读

PS:不可重复读 VS 幻读

7.隔离级别实战

7.1.查询事务隔离级别

7.2.设置事务隔离级别

7.3.脏读问题

7.4.不可重复读问题

7.5.幻读问题


1.什么是事务?

事务(Transaction)是将⼀组操作封装成⼀个执⾏单元(封装到⼀起),这⼀个执⾏单元要么⼀起执⾏成功,要么⼀起失败,不会出现执⾏“⼀半”的情况。

数据库引擎:InnoDB才支持事务,MyISAM不支持事务。

2.为什么用事务?

以银⾏转账为例,张三给李四转账,那么它的执⾏流程是这样的:

  • 张三账户 -500
  • 李四账户 +500

试想⼀下,如果执⾏了⼀半,断点了或者程序崩溃了,那么张三账号的钱就永久消失了?

使⽤数据库演示⼀下,准备测试表:

那怎么办?⽤事务就可以解决,封装成⼀个执⾏单元,要么⼀起成功,要么⼀起失败。

【将执行了一半的张三账户存储到磁盘里,当异常恢复之后,查看sql日志,执行回滚逆操作:张三账户+500】

3.事务怎么用?

事务的使⽤步骤有三个:

  1. 开启事务(MySQL8之前使用的是start transaction,MySQL8之后使用的是begin)。
  2. 执⾏多条 SQL。
  3. 提交/回滚事务(commit/rollback)。

事务在开启之后,必须以提交事务或回滚事务来结束。否则之前的执行都是无效的。

⽐如上⾯的张三给李四转账,事务执⾏ SQL 如下:

4.事务的四大特性(ACID)

①原子性(Atomicity,又称不可分割性)

⼀个事务中的所有操作,要么全部执⾏成功,要么全部执⾏失败。

原⼦性是事务最重要的特性,全部执⾏失败并不是不执⾏,⽽是通过逆操作 rollback(回滚)数据。

实现原理:回滚是逆 SQL 操作:⽐如 A 账户 -500 元的逆操作就是 A 账户 +500 元。

②一致性(Consistency)

⼀个事务在执⾏前后数据必须保持⼀种合法的状态,事务总是从⼀个⼀致状态到另⼀个⼀致状态。

举例说明:⽐如转账操作,转账之前两个账户的总额是 100 元(各个 50 元),那么两个账户相互转账之后的钱总额也是 100 元,也就是事务总是从⼀个⼀致状态到另⼀个⼀致状态,不会说转账之前是 100 元,相互转账之后变成 80 了,这就不符合⼀致性了。

③隔离性(重要)(Isolation,又称独立性)

多个事务并发访问时,事务之间是相互隔离的,⼀个事务不应该被其他事务⼲扰,多个并发事务之间要相互隔离。

举例说明:⽐如宠物店,如果宠物店来了⼀个狗狗,那么是可以正常的处理它的诉求的,⽐如打个疫苗啊、美个容啊都是可以很顺利的完成的,但是如果⼀个 20 平⽅的宠物商店来了 20 只狗那它们就得打起来了,这个时候怎么办?把它们装到笼⼦⾥⾯“隔离”起来啊,这和咱们的事务的隔离性是⼀样的,都是解决多个事务同时请求的问题的。

MySQL 隔离性对应的隔离级别有以下 4 种,这就像隔离狗的笼⼦有各个级别的⼀样,有⼤的、有⼩的、有不透光的,有透光的等等,这些不同个隔离级别都是为了更好的实现隔离的。

④持久性(Durability)

事务执⾏完成之后,它所做的所有修改都是永久的(不会丢失)。

数据存储到磁盘中就是持久的,不会丢失的,不会因为电脑重启⽽丢失。

5.MySQL 事务隔离级别有 4 种(重要)

①READ UNCOMMITTED(读未提交/未提交读)

该隔离级别的事务可以看到其他事务中未提交的数据。

该隔离级别因为可以读取到其他事务中未提交的数据,⽽未提交的数据可能会发⽣回滚, 因此我们把该级别读取到的数据称之为脏数据(幽灵数据),把这个问题称之为脏读

②READ COMMITTED(读已提交/提交读)

该隔离级别的事务能读取到已经提交事务的数据, 因此它不会有脏读问题。

但由于在事务的执⾏中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读

③REPEATABLE READ(可重复读)(默认)

是 MySQL 的默认事务隔离级别,它能确保同⼀事务多次查询的结果⼀致。

但也会有新的问题,⽐如此级别的事务正在执⾏时,另⼀个事务成功的插⼊了某条数据,但因为它每次查询的结果都是⼀样的,所以会导致查询不到这条数据,⾃⼰重复插⼊时⼜失败 (因为唯⼀约束的原因)。明明在事务中查询不到这条信息,但⾃⼰就是插⼊不进去,这就叫幻读 (Phantom Read)。 

④SERIALIZABLE(序列化)

事务最⾼隔离级别,它会强制事务排序,使之不会发⽣冲突,从⽽解决了脏读、不可重复读和幻读问题,但因为执⾏效率低,所以真正使⽤的场景并不多。

6.并发事务中的问题

a.脏读

⼀个事务读取到了另⼀个事务修改的数据之后,后⼀个事务⼜进⾏了回滚操作,从⽽导致第⼀个事务读取的数据是错误的。

b.不可重复读

在⼀个事务中,两次查询同⼀条数据得到了不同的结果就是不可重复读。在⼀个事务两次查询中间,另⼀个事务把这条数据修改了。

c.幻读

当同⼀查询在不同时间产⽣不同的结果,就是事务中的幻读问题。

例如,⼀个 SELECT 被执⾏了两次,但是第⼆次返回了第⼀次没有返回的⼀⾏,那么这⼀⾏就是⼀个“幻像”⾏。

PS:不可重复读 VS 幻读

  • 不可重复读描述的侧重点是修改操作,比如t1时间读取了一行数据,t2时间读取到了这个数据,内容已经改变了。
  • 幻读描述的侧重点是添加或删除操作,比如t1时间使用一个sql得到了n条数据,在t2时间使用相同的sql却得到了n+1条数据,那么多出来的这一条数据就叫做幻象行,这个操作就叫做幻读。

7.隔离级别实战

7.1.查询事务隔离级别

@@global.tx_isolation是全局事务隔离级别;@@tx_isolation是当前连接客户端的事务隔离级别。

7.2.设置事务隔离级别

MySQL是支持给每个连接客户端单独设置事务的隔离级别。

set session transaction isolation level 事务隔离级别;

7.3.脏读问题

7.4.不可重复读问题

7.5.幻读问题

事务隔离级别关注的是不同事务之间是否会相互影响,B事务不应该应该A事务才对。

这里是用不同的客户端来演示不同的事务,大概率是不同的用户,只有不同的用户才能在同一时间执行不同的事务。

 

 

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

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

相关文章

文本转语音怎么转?教你三招轻松搞定

近年来,人工智能技术飞速发展,语音合成技术 (TTS) 已经被广泛应用于各种应用场景中。在日常生活中,人们经常需要阅读长篇文章、新闻报道、科技论文等,但传统的阅读方式不仅效率低下,而且容易让人感到疲劳。随着语音合成…

品牌需要来看看这个UP主眼里的“她困境”

连续三次发布带货视频,但却仍然涨粉3w。 5月16日,时尚区UP主鹦鹉梨在B站发布作品《漫画胸能不能走出现实啊????》,视频中UP主指出现在女性在生活中的一大困境,当下互联网上的审美一…

【突发奇想 之 vector使用时性能测试】

目录: 前言分析vector不同操作对时间的影响1.for循环中使用 size()成员函数2.初始化时初始化为0,与其他值3.vector分配容量问题4. vector赋值操作5. 遍历:下标和迭代器 总结 前言 打怪升级:第90天 分析vector不同操作对时间的影响…

2023百城巡展|首站北京迎来新老朋友,百家聚势共拓数安蓝海

“新起点 新战略 共赢数安蓝海” 2023年4月 在首届渠道高峰论坛上 美创通过一系列革新之举 传递了坚定渠道化战略的决心 2023年5月 步履不停,加速渠道战略下沉 与全国各地伙伴更深入沟通,互信赋能 美创2023百城巡展正式启航 5月23日,美…

python绘制带置信区间的折线图

本文目录 一、数据准备二、添加置信区间三、完整代码四、运行结果五、python绘图往期系列文章目录 在统计学和数据分析领域中,我们常常需要比较两个或多个样本数据之间的差异。而带置信区间的折线图则是一种直观且常用的展示数据差异的方式。在这篇文章中&#xff0…

xml报文转Java实体

公众号推广: 目前CSDN进行VIP可见,文章可在微信公众号进行免费的阅读。 文章内容经过认证实践,比较的清晰易懂,适合初次接触的人员。 请关注微信公众号:菜鸟编程踩坑之路,进入公众号搜索关键词 xml转实体 需求场景: 因为需要对接一些比较老的系统接口,他们的请求方…

AI生成和修改音频音乐类工具网站集合

AI时代,有最强问答ChatGPT,有文本生成图像的Stable Diffusion,Midjourney,当然也少不了AI生成和修改音频的各种工具,我们整理出其中最具影响力的,并且可能最用得上的一些收录到 AI生成和修改音频类工具网站集合​http://www.webhu…

Vue3:组件基础(下)

Vue3:组件基础(下) Date: April 12, 2023 Sum: props验证、计算属性、自定义时间、组件上的v-model、任务列表案例 目标: 能够知道如何对 props 进行验证 能够知道如何使用计算属性 令能够知道如何为组件自定义事件 令能够知…

照相机标定

一.相机标定的原理 1.1 相机如何成像: 相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。 1.1.1 世界坐标系: 世界坐标系(world coordinate),也称为测量坐…

面试技巧:原来薪资可以这样谈~

从房地产到程序员是蓄谋已久,也是时机成熟 2020年毕业之后,我便开始从事房地产销售工作,卖了两年房子才来黑马学习。 其实毕业那年就想来黑马学习的,虽然大学专业学的工商管理,但是我对计算机专业更感兴趣。毕业时&a…

2个半月学习成功上岗软件测试,我一个文科女也能吃IT饭了

想不到我一个文科生也能吃上IT饭,真的是太香了!!! 程序员的待遇怎么这么好!(请大家原谅我没有见过市面的感叹,对于我这种刚上岗的新手而言,能够在厦门这个全国工资房价比最低的地方…

手机照片如何压缩?高效软件分享

现如今,手机已经成为了人们生活中不可或缺的一部分。我们用手机来拍摄照片,记录生活中的点滴,与朋友分享美好时刻。但是,随着手机像素越来越高,照片的体积也越来越大,使得手机储存空间不够用,而…

ApiKit 干货纯享|20分钟搞定接口管理、开发、测试全流程!

一. ApiKit 简介 ApiKit 是 API 管理 Mock 自动化测试 异常监控 团队协作 ApiKit 主要用于接口管理、开发、测试全流程集成工具,使用受众为整个研发技术团队,主要使用者为前端开发、后端开发和测试人员。从个人开发者到跨国企业用户,Api…

aop实现自定义注解

注解简单知识 关键字 自定义注解的关键字是interface 参数类型 自定义注解的参数类型:八大基础类型、String、枚举、注解,还可以是以上类型对应的数组 如果只有一个成员变量,名字叫value 注解赋值 如果定义了成员变量,必须…

ROS/ROS2工程中的路径管理

1 Launch文件访问yaml ROS2中,launch文件可以用python编写,且后缀名为.launch.py,由于python比传统的xml更加灵活,因此,可以在launch文件中找到某个package的yaml。yaml通常存在package下面的config目录下&#xff0c…

30 KVM管理系统资源-CPU热插

文章目录 30 KVM管理系统资源-CPU热插30.1 概述30.2 约束限制30.3 操作步骤30.3.1 配置虚拟机XML30.3.2 热插并上线CPU 30 KVM管理系统资源-CPU热插 30.1 概述 在线增加(热插)虚拟机CPU是指在虚拟机处于运行状态下,为虚拟机热插CPU而不影响…

企业级信息系统开发——初探Spring - 采用Java配置类管理Bean

文章目录 一、打开项目二、创建子包三、创建杀龙任务类四、创建勇敢骑士类五、创建Spring配置类六、创建测试类七、运行测试类八、总结Spring管理Bean的四种方式 一、打开项目 Maven项目 - SpringDemo 二、创建子包 在net.shuai.spring包里创建day04子包 三、创建杀龙任务…

open3d-gui 所有不同种类的部件

整体效果如上. 下面一步一步添加部件来实现. 目录 1. 菜单栏 2. 文件选择部件 3. 垂直可折叠部件 3.1 label部件 3.2 复选框checkbox 3.3 色板 3.4 下拉框combobox 3.5 拨动开关toggleSwitch 3.6 部件代理WidgetProxy 3.7 WidgetStack 3.8 列表 3.9 树形视图 3.…

AI时代的数据革命,分布式融合存储为何堪当大任?

有人说,以ChatGPT为代表的人工智能应用的兴起标志着AI时代奇点来临。 诚然如斯。这一波AIGC浪潮来袭,让人们真正意识到AI给生产力带来的巨大飞跃。从今年起,AI大模型成为行业用户重点关注的对象,甚至金融、媒体、广告营销等用户纷…

LangChain 实践之工具使用

参考:LangChain中文入门教程 LangChain官网 通过 Google 搜索并返回答案 import os os.environ["OPENAI_API_KEY"] "xxx" os.environ[SERPAPI_API_KEY] "xxx"from langchain.agents import load_tools from langchain.agents im…