Mysql 进阶(面向面试篇)事务篇

news2025/1/11 21:38:01

1、事务

1.1 事务简介

事务 是一组操作的集合,它是不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。保证原子性
就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加
1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。在这里插入图片描述
正常情况: 转账这个操作, 需要分为以下这么三步来完成 , 三步完成之后, 张三减少1000, 而李四
增加1000, 转账成功 :在这里插入图片描述
在这里插入图片描述
异常情况: 转账这个操作, 也是分为以下这么三步来完成 , 在执行第三步是报错了, 这样就导致张
三减少1000块钱, 而李四的金额没变, 这样就造成了数据的不一致, 就出现问题了。在这里插入图片描述
在这里插入图片描述
为了解决上述的问题,就需要通过数据的事务来完成,我们只需要在业务逻辑执行之前开启事务,执行
完毕后提交事务。如果执行过程中报错,则回滚事务,把数据恢复到事务开始之前的状态。在这里插入图片描述
注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

2 事务操作

数据准备:
6.2.1 未控制事务
1). 测试正常情况
测试完毕之后检查数据的状态, 可以看到数据操作前后是一致的。
2). 测试异常情况

drop table if exists account;
create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

2.1 未控制事务

1)测试正常情况在这里插入图片描述
测试完毕之后检查数据的状态, 可以看到数据操作前后是一致的。在这里插入图片描述
2)测试异常情况在这里插入图片描述
我们把数据都恢复到2000, 然后再次一次性执行上述的SQL语句(出错了… 这句话不符合SQL语
法,执行就会报错),检查最终的数据情况, 发现数据在操作前后不一致了。在这里插入图片描述

3、控制事务一

在这里插入图片描述
注意:上述的这种方式,我们是修改了事务的自动提交行为, 把默认的自动提交修改为了手动提交, 此时我们执行的DML语句都不会提交, 需要手动的执行commit进行提交。

4、控制事务二

在这里插入图片描述
在这里插入图片描述

5、事务四大特性

在这里插入图片描述

6、事务并发问题

1)脏读
赃读:一个事务读到另外一个事务还没有提交的数据。在这里插入图片描述
2)不可重复读
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。

在这里插入图片描述
3)幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
在这里插入图片描述

7 事务隔离级别

越往下隔离级别越高,越安全,但是花销变大
在这里插入图片描述
在这里插入图片描述

8 举例子说明7中的事务隔离级别

1、read uncommited 遇到的脏读问题体现
1)开启两个mysql客户端,模拟两个并发操作的线程。并设置客户端1的事务级别为 read uncommited,注意此时mysql的提交为手动提交事务。
在这里插入图片描述
2)在左右两个客户端中使用sql语句 start transcation;开启事务
3)左客户端查表,张三的money为2000,如下图1,随后右客户端在开启事务后,更新表中张三的money为1000,但是并未提交事务,如下图2。
在这里插入图片描述
在这里插入图片描述
4)此时在左客户端接着查询表中的数据,发现张三的money为1000。这就是脏读,读了其他事务未commit的数据
在这里插入图片描述
A事务读到了B的未提交的事务,这叫脏读

2、read uncommited 遇到的脏读问题的解决方案—设置隔离级别为read commited

1)将左客户端的隔离级别设置为 read commited即可解决脏读问题
在这里插入图片描述
2)验证一下
在这里插入图片描述
只有在右客户端完成修改操作并commit了以后,左客户端才能查到张三的money少了1000元,也就是说 read commited解决了脏读的问题

3、read commited遇到的不可重复读

同一个事务中,查询第一次是一个数据,但是在查第二次和第一次之间,有其他事务对数据进行了修改并commit,造成了第二次查到了与第一次不一样的数据。这就是不可重复读
在这里插入图片描述
4、隔离级别升级—解决不可重复读问题,Repeatable read
在这里插入图片描述
只有在A事务commit了之后,才会读到B事务修改并提交的内容。保证了在同一事物过程中,读到的数据是一致的,不受其他事务的干扰

5、Repeatable read存在幻读的现象如下

在这里插入图片描述
此时事务B去开启事务并insert数据 id=3,并提交
在这里插入图片描述
接着事务A 再去插入id=3的数据,发现主键为3的数据重复,说明存在。
这不就幻读了吗,我明明查不到id=3的数据,所以我插入数据怎么又重复呢?
在这里插入图片描述

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

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

相关文章

仿英雄联盟网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW游戏介绍网页作业代码下载

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

推荐系统CTR方向相关论文一句话总结

Fearure Interaction // CTR纯FM模型及其演变Factorization Machines. 2010Field-aware Factorization Machines for CTR Prediction. 2016Neural Factorization Machines for Sparse Predictive Analytics. 2017Attentional Factorization Machines: Learning the Weight of F…

StringBuffer类

StringBuffer基本介绍 StringBuff代表可变的字符串,可以对字符串内容进行增删很多方法与String相同,但StringBuff是可变长度的StringBuff是一个容器 了解StringBuffer StringBuffer的继承关系: 可以看到StringBuffer继承AbstractStringBu…

【计网实验】思科CiscoPacketTracer仿真实验

本文参考B站up主:湖科大教书匠 软件版本:Cisco Packet Tracer 6.1.1sv ❓ 实验01的内容较为简单,所以不写了~ 🌹 因作者水平有限,若有遗漏、错误等地方,请大佬批评指正 实验02:访问Web服务器 实…

设计必备,5个png免抠素材网站,建议收藏

做设计、PPT都需要用到大量的免抠素材,职场中熟练使用Photoshop的人毕竟是少数,也很少有人愿意花费时间去精细抠图。那这5个免抠素材网站一定要收藏好,可以有效帮你节省时间,提高工作效率。1、菜鸟图库 https://www.sucai999.com/…

计算机毕业设计php+vue基于微信小程序的员工宿舍报修系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,员工宿舍报修系统就是信息时代变革中的产物之一。 任何系统都要遵循系…

进程被杀Task被移除

现象 Kill查杀 Task被移除 当Task处于前台&Task中唯一的activity不处于onStop(可能处于onResume/onPause等)状态时,当前进程被kill查杀,当前activity会被finish导致task中因无activity而被移除。 12-08 15:20:54.991 18018…

Windows11去掉桌面快捷方式箭头

有部分强迫症用户,看到桌面每个图标都有一个小箭头,只想去掉看着舒服一点 但是Win10的大部分脚本都不能使用了,而且有可能导致桌面图标显示异常,不建议大家再去用脚本尝试(Win11也有脚本,但是随便更新版本&#xff0c…

深入理解Kafka Producer内部机制

总的来说,Kafka Producer是将数据发送到kafka集群的客户端。其组成部分如下图所示: 基本组件: Producer Metadata——管理生产者所需的元数据:集群中的主题和分区、充当分区领导者的代理节点等。Partitioner——计算给定记录的分…

Pygame入门-游戏代码结构及背景轮播、声音音效及图像动态效果

一、游戏代码结构 代码结构是代码的组织方式,也是游戏编程的思考框架。pygame官方文档中给出了以下建议,将游戏代码结构分为以下六个部分。 1导入游戏模块。 2资源处理类;定义一些类来处理最基本的资源,包括加载图像和声音,连接和…

C#(csharp)这门语言的优势在哪?

确实有不少人因为unity入坑C#,unity刚开始使用的语言也有很多,比如Unity(一种Java的扩展)或者Boo(一种受Python启发的语言),但C#坚持至今甚至成为unity使用主流,C#当然有它的优点。 …

实测 ChatGPT 编程效果被其发现,这波我先站队 Stack Overflow

本文对 ChatGPT 解答编程问题的情况进行了测试。测试了不同难度的问题,并对 ChatGPT 的回答结果进行了鉴别。测试结果表明,ChatGPT 在解答简单的编程问题时表现较为出色,但在解决复杂的问题时则不太理想。因此,也总结出了如何更好…

Vulnhub靶机:SICKOS_ 1.1

目录介绍信息收集主机信息探测主机信息探测网站探测Getshell敏感信息收集SUDO提权第2种通关思路nikto扫描站点验证破壳漏洞破壳漏洞利用计划任务提权修复文件内容错乱 & 提权总结介绍 系列:SickOs(此系列共2台) 发布日期:201…

springboot+netty实现站内消息通知(完整代码)

代码用到的组件介绍 ChannelInitializer 见名知意,就是channel 初始化器,当每个客户端创建连接时这里面的代码都会执行一遍。由于,连接建立之后,这个channel就会常驻内存,所以这里就有个值得思考的问题: …

【vue核心】1.vue简介

1. 官网 英文官网: https://vuejs.org/ 中文官网: https://cn.vuejs.org/ 2. 介绍与描述 动态构建用户界面的渐进式 JavaScript 框架 作者: 尤雨溪 3. Vue 的特点 遵循 MVVM 模式 编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发 它本身只关注UI, 也可以引入其它第三…

新冠疫苗预约小程序设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把新冠疫苗预约管理与现在网络相结合,利用java技术建设新冠疫苗预约小程序,实现新冠疫苗预约的信息化。则对于进一步提高新冠疫苗预约管理发展,丰富新冠疫苗预约管理经验能起到不少的促进…

数据库挖矿系列-优化器设计探索穿越之旅

作者:王晨 阿里云数据库产品团队 前言 引用来自百度百科的话:在数据库技术发展历史上,1970 年是发生伟大转折的一年,因为这一年的6月,IBM的圣约瑟研究实验室的高级研究员Edgar Frank Codd在Communications of ACM 上…

微信中使用ChatGPT

ChatGPT 微信 Bot1. Ubuntu2. 卸载旧版本3. apt 安装4. 添加软件源的GPG密钥5. 添加docker源到sources.list6. 安装 docker7. 启动 docker8. 建立docker用户组9. 测试10. wechat-chatgpt 搭建11. 获取 会话令牌12. 运行13. 使用微信小号扫码登录14. 重新登录14.1 停止运行容器1…

【Python项目】Python实现点选验证码识别, 模拟B站登陆 | 附源码 学习资料

前言 halo,包子们下午好 今天小编带大家是想b站模拟登陆,Python实现验证码识别 废话不多说,直接开整 相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 公众号:Python日志 源码点击蓝色字体领…

Docker Desktop下部署springboot项目

一、前言 本文是基于windows10版本下的docker desktop来演示的,所以你需要自行安装docker desktop,可以是windows,也可以是mac,根据自己的电脑进行选择即可。 二、创建springboot项目 创建一个springboot web项目,这个比较简单&#xff0c…