【MySQL】深度学习数据库开发技术:mysql事务穿透式解析

        前言:本节内容开始讲解事务。 博主计划用三节来讲解事务。 本篇为第一节, 主要解释什么是事务, 事务有什么用。 以及事物的基本操作和异常退出回滚情况。 下面不多说,友友们, 开始学习吧!

        ps:本节内容建议友友们学会表的操作后再来学习哦, 会学的轻松很多!

目录

什么是事务

CURD满足什么性质, 才能解决上面的问题呢?

MySQL事务维护的四大属性

为什么会出现事务

实际操作准备工作

事务正式操作

rollback to

rollback

commit持久化

事务异常

自动提交和不自动提交


什么是事务

        我们现实大部分都是一组sql,才能将一系列操作给做出来。在我们程序员的眼中,一条sql就是一条操作。但是对于上层用户来说,往往几条sql来完成某个逻辑,就比如买票。 而这几条sql,我们就称为事务。所以,事务的本质要站在mysql的上层来看,就是一条或者多条sql组合起来完成某种逻辑的集合体。

        并且,对于数据库的CURD来说,我们的买票场景, 可能就有时候只剩下一张票, 这时候来了一个人买票, 但是还没有更新数据。此时又来了一个客户端, 发现票数大于0, 就又买了一次票。 但是当两个客户端都更新数据的时候, 发现票数变为了-1。 这个时候就发生错误了, 相当于多卖了一张票。 所以, 事务就出现了。

CURD满足什么性质, 才能解决上面的问题呢?

  •         买票的过程是原子的;
  •         买票的过程不应该互相影响;        
  •         买完票应该是永久的;
  •         买完票后的状态应该是确定的;        

MySQL事务维护的四大属性

  •         原子性:要么完成, 要么不完成。
  •         一致性:一致性就是一个事务开始和开始之后, 我们用户数据的完整性没有被破坏。在mysql中, 对于一致性没有更多的操作。他只要做好原子性、隔离性、持久性、就能在技术层面上完成一致性。
  •         隔离性:数据库允许多个事务同时对数据进行修改和读写。隔离性可以将一个一个的事务隔离开, 就能让事务之间不会彼此影响。事物的隔离性存在不同的分级。
  •         持久性:事务处理完之后, 对于数据的修改就是永久的。即使是系统故障也不会丢失。

       这四大属性被称为ACID     

为什么会出现事务

        事务是被mysql编辑着设计出来的。的按时事务不是天然就有的, 而是当mysql被写出来之后, 发现需要这个东西。另外, 他是为了让我们的C/C++或者java, python这种用起来更加方便, 简化编程模型, 要么提交, 要么回滚。 我们不去考虑宕机, 网络异常各种情况。 所以, 事物本身就是为了应用层服务的。

实际操作准备工作

        在mysql中, InnoDB支持事务, 但是MyISAM是不支持事物的。

        事务有两种提交方式:一种叫手动提交, 一种叫自动提交。

        未来我们有事务,我们得自己提交。 mysql中事务的提交方式有两种:默认提交,手动提交。 如何查看当前事务的提交方式?

        使用指令:

show variables like 'autocommit';

        然后我们进行测试的时候, 我们的隔离级别, 先设置成读未提交。 后面我们在来讲解这些不同的隔离级别:

set global transaction isolation level read uncommitted;

         然后查看当前的隔离级别:

select @@transaction_isolation;

        然后创建一个下面这样的表:

create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10, 2) not null default 0.0
);

事务正式操作

利用一个案例来看如何操作事务:

rollback to

我们先启动事务

start transaction;

 

设置保存点

savapoint 名称;

 

 插入数据之后再设置一个保存点

insert into account values(1, '张三', 1234.5);
savepoint s2;

 然后再插入数据, 同时设置保存点:

insert into account values(2, '李四', 4321.6);
savepoint s3;
insert into account values(3, '王五', 5432.7);

 此时观看表中, 就看到数据都插入进来了:

问题是, 如果今天我后悔了, 我不想插入李四和王五了。 我们怎么做呢? 就可以使用定向回滚, 回滚到我们设置的某一个保存点处。 

rollback to s2;

 

我们再查看表中数据, 就没有李四和王五了!        

 

然后事务结束之后, 我们不想要回滚了, 就像直接提交了。 我们就可以使用commit

commit;

rollback

然后我们也可以直接rollback把从开始到目前所做的操作全部放弃掉。

start transaction;
insert into account values(1, '张三', 1234.5);
insert into account values(2, '李四', 4321.6);
insert into account values(3, '王五', 5432.7);

rollback;

 

commit持久化

然后我们再启动事务。 这一次我们插入数据后直接提交。 然后再回滚:

start transaction;
insert into account values(2, '李四', 4321.6);
insert into account values(3, '王五', 5432.7);
commit;
//ctrl + \

我们就会看到, 即便我们进行了回滚,数据也没有变化。 即:只要事务提交了, 就完成了持久化, 事务无法回滚!!!

事务异常

        我们要做的实验就是我们正在启动有一个事务。 但是客户端挂掉了, 莫名崩溃掉了。 这个时候mysql是怎么处理的。 所以我们就先插入一条数据, 然后ctrl + ‘\’, 让mysql客户端崩溃。 如下:

start transaction;
insert into account values(4, '赵六', 6666.6);

然后我们再查看表数据, 会发现, 新插入的数据没有提交, 没有持久化。 也就是完成了自动回滚。 

 

        直接关掉终端也是一样的, 但是截图不了。 友友们自行测试。

这一次, 我们先commit, 再异常退出:

start transaction;
insert into account values(4, '赵六', 6666.6);
commit;
//ctrl + \


结果可以预见, 完成了持久化:

        默认情况下, 提交方式是自动提交:

show variables like'autocommit';

        但是, 对于事物的提交类型。 自动提交不影响我们的begin和commit。 对于begin也就是手动开启的事务来说, 我们收到开启, 就得手动commit。也就是说, 即便我们将set autocommit = 0,结果也不会有什么不同。  

自动提交和不自动提交

现在我们来谈一下自动提交和不自动提交有什么用。 现在来一组对比试验:

先看自动提交:

show variables like 'autocommit';

我们再另一个客户端上面启动一个事务, 然后查看当前表的数据:

然后回到原来的客户端删掉id为1的数据:

delete from account where id = 1;

这个时候我们终止这个客户端。

show variables like'autocommit';

然后去另一个客户端查看表数据, 会发现, 刚刚删掉的数据确实没了:

这个符合我们的预期。 

但是我们再来看另一个实验, 这个时候设置为手动提交:

设置手动提交, 然后删除数据, 最后终止客户端。 

set autocommit = 0;
delete from account where id = 2;
//ctrl + \

我们去检查另一个客户端的数据,表中数据是否被删除:

可以看到, 并没有被删除。 

        通过上面我们的现象, 我们可以猜测, autocommit影响的是我们的单sql。 其实我们以前的sql语句, 都是一个事务。 这个事务默认是自动提交的。 并且我们能看到mysql的两大特性。 一个是原子性, 一个是持久性。   

——————以上就是本节全部内容哦, 如果对友友们有帮助的话可以关注博主, 方便学习更多知识哦!!!   

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swift解题 | 求平面上同一条直线的最多点数

文章目录 前言摘要问题描述解题思路Swift 实现代码代码分析示例测试与结果时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 149. 直线上最多的点数 不积跬步,无以至千里;不积…

使用Ansible自动化部署Zabbix6监控

1、获取Ansible离线部署包 链接:https://pan.baidu.com/s/1EjI02Ni8m9J4eJeBcJ-ZUQ?pwdzabx 提取码:zabx 2、安装Ansible wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum -y install ansible3、修改hosts文件…

lua闭包Upvalue

闭包 lua任何函数都是闭包,闭包至少带1个upValue; CClosure是使用Lua提供的lua_pushcclosure这个C-Api加入到虚拟栈中的C函数,它是对LClosure的一种C模拟 如string.gmatch就是cclosure 定义: #define ClosureHeader \CommonH…

二叉搜索树之遍历

二叉搜索树是一种重要的数据结构,它的每个节点最多有两个子节点,称为左子节点和右子节点。 二叉搜索树的特性是:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点…

Java基础访问修饰符全解析

一、Java 访问修饰符概述 Java 中的访问修饰符用于控制类、方法、变量和构造函数的可见性和访问权限,主要有四种:public、protected、default(无修饰符)和 private。 Java 的访问修饰符在编程中起着至关重要的作用,它…

安心护送转运平台小程序

安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统,可以根据运营者的业务提供类似短途接送救护服务,重症病人转运服务,长途跨省护送服务。

人工智能技术在外骨骼机器人中的应用,发展历程与原理介绍

大家好,我是微学AI,今天给大家介绍一下 人工智能技术在外骨骼机器人中的应用,发展历程与原理介绍 。外骨骼机器人是一种 套在人体外部的可穿戴机器人装置 ,旨在增强人类的身体能力和运动功能。其独特之处在于能够与人体紧密配合&a…

类型转换与IO流:C++世界的变形与交互之道

文章目录 前言🎄一、类型转换🎈1.1 隐式类型转换🎈1.2 显式类型转换🎁1. C 风格强制类型转换🎁2. C 类型转换操作符 🎈1.3 C 类型转换操作符详解🎁1. static_cast🎁2. dynamic_cast&…

如何手搓一个智能宠物喂食器

背景 最近家里的猫胖了,所以我就想做个逗猫棒。找了一圈市场上的智能逗猫棒,运行轨迹比较单一,互动性不足。 轨迹单一,活动范围有限 而我希望后续可以结合人工智能物联网,通过摄像头来捕捉猫的位置,让小…

【AI系统】AI 编译器基本架构

AI 编译器基本架构 在上一篇文章中将 AI 编译器的发展大致分为了 3 个阶段,分别为 1)朴素编译器、2)专用编译器以及 3)通用编译器。 本文作为上一篇文章 AI 编译器架构的一个延续,着重讨论 AI 编译器的通用架构。首先…

用 React 编写一个笔记应用程序

这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器,常用于JavaScript环境中生成随机、唯一的字符串ID,如数据库主键、会话ID、文件名等场景。 …

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

Day1——GitHub项目共同开发

MarkDowm解释 Markdown是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易,同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…

【攻防世界】WEB-inget

首先找到该关卡 启动靶场环境 访问靶场 构造一个id参数,尝试访问,无内容回显 使用sqlmap工具,先获取数据库,输入命令sqlmap -u http://61.147.171.105:58893/?id1 --dbs 发现第一个即为所需数据库,接下来进行获取…

【C++】深度剖析经典编程题目:电影票、A+B与鸡兔同笼的解决方案

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯牛牛买电影票问题题目描述解题思路代码实现优化思路总结 💯AB问题题目描述解题思路代码实现代码优化总结 💯鸡兔同笼问题题目描述解题思路数学解法代…

掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)

前面化解了Micro_ROS通讯问题,并在 RT-Thread Studio 环境下,使用Micro_ROS软件包中的例程,实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c ,实现了接收 turtle_teleop_key 所发出的 turtle…

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以: 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…

ComfyUI | ComfyUI桌面版发布,支持winmac多平台体验,汉化共享等技巧!(内附安装包)

ComfyUI 桌面版正式推出,支持 Windows 与 macOS 等多平台,为 AI 绘画爱好者带来全新体验。其安装包便捷易用,开启了轻松上手之旅。汉化共享功能更是一大亮点,打破语言障碍,促进知识交流与传播。在操作上,它…

CAD深度清理工具-AVappsDrawingPurge9.0.0(2024.8.27版本) 支持版本CAD2022-2025-供大家学习研究参考

图形文件DWG体积很大:通常没有明显的数据。同时,还其他症状包括: (1)无法复制和粘贴图元。 (2)悬挂较长时间选择文本与 “特性”选项板上打开。 (3)图形文件需要很长时间…

鸿蒙Next星河版基础用例

目录: 1、鸿蒙箭头函数的写法2、鸿蒙数据类型的定义3、枚举的定义以及使用4、position绝对定位及层级zIndex5、字符串的拼接转换以及数据的处理(1)字符串转数字(2)数字转字符串(3)布尔值转换情况(4)数组的增删改查 6、三元表达式7、鸿蒙for循环的几种写法7.1、基本用…