【MySQL】不就是事务

前言

  嗨咯,小伙伴们大家好呀,我已经一个星期没有更新了,实在抱歉!本期我们要学习MySQL初阶中的最后一课,MySQL数据库中的事务也算是近几年面试必考的问题,所以我们一定要认真学习。

 目录

前言

 目录

一、事务的简介

二、事务操作

2.1 查看/设置事务提交方式

 2.2 手动开启事务

2.3 提交事务

2.4 回滚事务 

2.5 案例练习

2.5.1 查看MySQL事务

2.5.2 银行转账模拟练习

2.5.2.1 创建余额表

2.5.2.2 模拟转账流程 李白给杜甫转账1000元 (自动提交事务模式)

2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式) 

三、事务的四大特性

四、并发事务问题与事务的隔离级别

4.1 并发事务的问题

4.2 事务的隔离别

 4.3 相关语句

4.3.1 查看事务的隔离界别

4.3.2 设置事务的隔离界别

4.4 实战练习

4.4.1 打开两个客户端进行操作​编辑

4.4.2 查看事务隔离级别

4.4.3 查看当前表中的数据

4.4.4 在另一个客户端进行更新操作

4.4.5 再另一个客户端进行查询操作

4.4.6 设置事务隔离级别为read committed

4.4.7 设置为repeatable read

4.4.8 设置事务的隔离级别为serializable;

五、总结


一、事务的简介

  事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

  普法课堂:法外狂徒”张三“昨天偷了李四5000元存入银行中,张三第二天良心发现犹豫再三决定告诉李四这件事情。李四听了这件事情后决定给张三一个重新做人的机会。只要张三把钱归还给自己,之前的事情既往不咎。张三也在第二天匆匆地赶去银行把自己账户中的5000元通过银行转账归还给李四。张三查了查自己的账户里边有5000元。

  现在我们想一下转账的流程:张三账户-5000元——>李四的账户+5000元。

张三在银行中的确把所偷盗的五千元转给了李四。银行的工作人员说最晚48小时内李四就可以收到,但是时间一转眼过去了一周,李四没有收到张三归还的五千元,李四报了警!

最后因为银行系统出现故障导致李四无法收到转账!最后请问张三构成犯罪吗?这就是我们今天要学习的事务,要么张三银行账户-5000,李四银行账户+5000,要么张三账户不扣钱,李四也不加钱。

注意:默认MvSQL的事务是自动提交的,也就是说,当执行一条DML(insert、update、delete、select)语句,MvSQL会立即隐式的提交事务。

二、事务操作

2.1 查看/设置事务提交方式

select @@autocommit;

 2.2 手动开启事务

start transaction;
begin;

2.3 提交事务

commit;

2.4 回滚事务 

rollback;

2.5 案例练习

2.5.1 查看MySQL事务
select @@autocommit;

   为1表示自动提交,为0表示需要手动提交事务,改为手动之后再提交事务时候必须使用commit,同时也需要自己进行回滚。

2.5.2 银行转账模拟练习
2.5.2.1 创建余额表

表结构如下

create table account
(id    int auto_increment primary key comment '用户id',name  varchar(10) comment '姓名',money int comment '余额'
);

添加数据

insert into account values('001','李白',5000),('002','杜甫',3000),('003','白居易',2500);
2.5.2.2 模拟转账流程 李白给杜甫转账1000元 (自动提交事务模式)

1.查询李白的账户

select * from account where name='李白';

2.李白的账户减去1000

update account set money=money-1000 where name='李白';

3.杜甫的账户增加1000

update account set money=money+1000 where name='杜甫';

4.查询账户表

select * from account;

2.5.2.3 模拟转账流程 李白给杜甫转账1000元 (手动提交事务模式) 

设置MySQL为自动提交事务,设置autocommit为0。

set @@autocommit=0;

1.开启事务

start transaction;

以下插入数据对数据进行操作的流程同2.5.2.2。

执行出错,要对事务进行回滚。要么全部执行,要么一个也不执行。

n.提交事务

commit;

三、事务的四大特性

原子性:(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性:(Consistency):事务完成时,必须使所有的数据都保持一致状态。

隔离性:(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性:(Durability): 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

!!!面试的时候容易考

四、并发事务问题与事务的隔离级别

4.1 并发事务的问题

4.2 事务的隔离别

注意: 事物的隔离级别越高,数据越安全,但是性能越低。 需要去权衡数据的安全性和并发性,进行设置事物的隔离级别。

 4.3 相关语句

4.3.1 查看事务的隔离界别

select @transaction_isolation;

4.3.2 设置事务的隔离界别

set
[session/global] transaction isolation level [read uncommitted | read committed |repeatable read |serializable];

4.4 实战练习

4.4.1 打开两个客户端进行操作

4.4.2 查看事务隔离级别
select @@transaction_isolation;

事务的隔离级别为默认值.

set session transaction isolation level read uncommitted;
4.4.3 查看当前表中的数据

4.4.4 在另一个客户端进行更新操作
set session transaction isolation level read uncommitted;
4.4.5 再另一个客户端进行查询操作

因为另一个客户端没有进行commit提交操作所以出现脏读。

4.4.6 设置事务隔离级别为read committed
set session transaction isolation level read committed;

提交事务之前于提交事务之后查询的李白的money不相同出现了不可重复读。

4.4.7 设置为repeatable read
set session transaction isolation level repeatable read;

在一个客户端查询id=4是否存在

select * from account where id='4';

在另一个客户端插入一条数据

select * from account where id='4';

在第一个客户端插入数据出现错误,但是查询id=4的仍然为空

select * from account where id='4';

出现幻读现象

4.4.8 设置事务的隔离级别为serializable;

当一个事务提交之后完毕之后另一个事务才开始执行,规避了幻读的问题

注意:事务的隔离级别越高,数据越安全,但是性能越低。

五、总结

在过去的一段时间里,我一直与大家分享关于MySQL数据库的知识和经验。我希望这些博文能够帮助你们更好地理解和应用MySQL,提升你们在数据库领域的技能。 然而,我认为现在是时候告别了。

我已经完成了初级阶段的博文学习,我相信你们已经掌握了一些基本的MySQL知识,并能够应用到实际项目中。 在这个阶段结束之际,我想向你们表达我的感激之情。感谢你们一直以来的支持和鼓励,是你们的反馈和建议让我不断进步。我也希望你们能够继续保持学习的热情,不断提升自己的技能。

如果你们还有任何关于MySQL数据库的问题,可以随时在评论区留言,我会尽力回答。同时,我也鼓励你们互相交流和分享,共同进步。 最后,我想再次感谢你们的支持和陪伴。希望我们能够在其他的学习领域再次相遇。 再见!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

派盘支持单向和双向资料同步

派盘作为一款本地云存储解决方案,不仅支持双向同步,还提供了设置部分文件夹单向同步的功能。这意味着用户可以根据自己的需求,精确控制文件夹的同步方向,以实现更有针对性的文件管理和同步。 π-Disk派盘 – 知识管理专家 派盘的…

最详细的下载安装PicGo图床配合Typora使用

1.node.js下载安装1.2 检验安装成功 2. PicGo下载安装3. 配置Gitee【配合PicGo使用】3.1 获取PicGo的token 4. 配置PicGo4.1 下载插件4.2 配置图床[Gitee]4.3 配置Typora 5. 上传图片到Gitee【重要】6.解决配置错误 1.node.js下载安装 【node.js下载链接】点击跳转页面&#x…

JVM (simple Version)

简介 JVM 其实就是一个Java进程 , 从操作系统申请一大块内存区域, 供 java 代码使用 . 申请出的内存 , 进一步划分 , 给出不同的用途 . JVM 内存区域划分 : 堆中存放就是 new 出来的对象. (成员变量) 栈 是用来维护方法之间的调用关系 (局部变量) 元数据区(或者叫方法区) 存放的…

day34-servlet 分页

0目录 servlet 1.分页 分页逻辑1:数据库中20条记录,要求每页5条数据,则一共有4页 分页逻辑2:数据库中21条记录,要求每页5条数据,则一共有5页 分页逻辑3:数据库中19条记录,要求每页…

Java阶段五Day04

Java阶段五Day04 文章目录 Java阶段五Day04订单交易案例调整项目案例环境克隆项目验证maven环境数据库导入本地mysql核心业务 实现csmall-for-jsd-all纵向拆分csmall-for-jsd-order系统 删除module(删除maven项目)idea记录maven忽略pull远程解决冲突git对…

Windows操纵kafka

这里写目录标题 启动kafk创建一个测试主题查看所有主题查看first详细信息修改分区数(分区数只能增加 不能减少)删除主题生产者生产数据消费命令 启动kafk 安装目录下 .\bin\windows\kafka-server-start.bat .\config\server.properties创建一个测试主题 安装目录下 .\bin\wi…

详解LeafLet中如何展示GeoServer发布的图层组

目录 前言 一、关于图层组 1、使用图层图组的好处 2、创建图层组 二、在Leaflet中展示图层组 1、新建Html模板框架 2、绑定地图map和底图设置 3、绑定图层组 总结 前言 在之前的博文中,曾经重点介绍如何使用LeafLet叠加Geoserver wms图层到已有底图的方法 ,…

【Spring | 资源处理】

Resource Resource 接口介绍核心方法常见接口优缺点 内置Resource实现UrlResourceClassPathResourceFileSystemResourcePathResourceServletContextResourceInputStreamResourceByteArrayResource Resource 接口 不幸的是,Java的标准Java.net.URL类和各种URL前缀的标…

Go实现socks5服务器

SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…

Web3 智能合约通过数组方式存储更多学生数据

之前的文章 Web3 在Truffle项目中编写出自己的第一个solidity智能合约带大家写了一个相对捡漏的智能合约 这样 每次 我们set 后 都会将原来的数据覆盖掉了 那么 有些人可能会想 那我们弄个数组 将新的数据全部加到数组里不就行了吗? 这个想法其实就很不错 我们可以…

智能汽车的主动悬架工作原理详述

摘要: 本文将详细介绍主动悬架功能原理设计。 主动悬架是车辆上的一种汽车悬架。它使用车载系统来控制车轮相对于底盘或车身的垂直运动,而不是由大弹簧提供的被动悬架,后者的运动完全由路面决定。主动悬架分为两类:真正的主动悬架…

OpenCV 入门教程:轮廓特征和轮廓匹配

OpenCV 入门教程:轮廓特征和轮廓匹配 导语一、轮廓特征二、轮廓匹配三、示例应用3.1 目标识别3.2 形状分析 总结 导语 轮廓特征和轮廓匹配是图像处理中用于描述和比较轮廓的技术。通过提取轮廓的形状、面积、周长等特征,并进行比较和匹配,我…