MySQL record 06 part

news2024/9/22 4:41:13

事务、存储过程
事务:

这里是引用
MySQL的同步,同步是指 together done,要么一起前进,要么一起后退的意思。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意,回滚 rollback 对已经提交 commit 的数据是无效的,也就是说,只能对没有被提交 commit 的数据进行回滚 rollback。
在这里插入图片描述
一个转账的案例如下:
在这里插入图片描述
在这里插入图片描述
a 的账户减少100,同时 b 的账户增加100

注意,MySQL默认是直接自动commit的,当commit之后就是做了持久化的操作,是不可回滚的,
所以要想不让MySQL自动commit的话,要以START TRANSACTION;声明,这样,在其后的语句就不会被MySQL自动commit了,直到用户输入了commit才会完成持久化的操作,也就是,以START TRANSACTION;起始的接下来的语句,在用户输入commit终结之前,所有的语句都可以rollback进行回滚,


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

setember2024the18thWednesday

在这里插入图片描述


事务的回滚

在这里插入图片描述
请注意,回滚前面有定语修饰,事务的回滚,而前面已经讲过,commit的出现表示事务的完结并持久化,也就是说在事务没有结束之前,即在没有出现commit的时候,事务中的语句是允许回滚操作的。
另一个需要注意的点是,在当前事务中进行使用了查询语句,是可以看到数据有改变的,但这只是表明在此事务中的数据的变化,并不是持久化后的最终数据,换个窗口或者工具进行查询就能看到数据并没有变化,所以说,在事务中使用查询语句得到结果只反应此事务中数据的变化,并不是持久化后的最终数据。


事务的隔离级别:

在这里插入图片描述
数据库中最高的隔离级别是‘可串行化’,在MySQL中的默认隔离级别是‘可重复读’,
在这里插入图片描述
在这里插入图片描述
设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
查询隔离级别语句:
SELECT @@transaction_isolation;
MySQL默认的隔离级别是:REPEATABLE-READ
设置语句是:
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
注意,如果使用隔离设置语句后,必须更换查询工具(或者关闭并重新打开当前查询工具)才能看出隔离级别的变化,一定要切记:改变了隔离级别后,一定要关闭查询工具,或者立即开启其他的查询工具,这样才能看到正确的修改后的隔离级别。


举例,一个读到未提交(隔离级别是READ-UNCOMMITTED)的脏读:

通过设置全局隔离级别:读到未提交 READ-UNCOMMITTED
±------------------------+ | @@transaction_isolation |
±------------------------+ | READ-UNCOMMITTED |
初始数据为: a、b 各1000 在这里插入图片描述
然后,在此隔离级别下演示脏读, 执行下面语句:
START TRANSACTION;
UPDATE account SET
money=money-100 WHERE name=‘a’;
UPDATE account SET money=money+100
WHERE name=‘b’;
注意,这里开启了事务 START TRANSACTION,但并没有提交COMMIT
在此事务中查询到的结果:
在这里插入图片描述
使用其他查询工具也能查到这个未提交的数据变化, mysql> select * from account;
±—±-----±------+ | id | name | money |
±—±-----±------+ | 1 | a | 900 | | 2 | b | 1100 |

这就是在‘读到未提交 READ-UNCOMMITTED ’隔离级别下,开启事务但未提交的时候,出现的脏读。
读到未提交的意思是,在一个用户开启事务但没提交之前对数所做的更改,被其他用户读到的现象。正常情况下,a用户开启事务后对数据的修改,其他用户是应该读不到数据发生的变化,直到a用户做提交动作后,其他用户才能读到已经变化的数据,


举例,一个读到已提交(隔离级别是READ-COMMITTED):

通过设置全局隔离级别:读到已提交 READ-COMMITTED
±------------------------+ | @@transaction_isolation |
±------------------------+ | READ-UNCOMMITTED |
初始数据为: a、b 各1000
在这里插入图片描述
然后,在此隔离级别下演示脏读, 执行下面语句:
START TRANSACTION;
UPDATE account SET money=money+100 WHERE name=‘a’;
UPDATE account SET money=money-100 WHERE name=‘b’;
注意,这里开启了事务 START TRANSACTION,但并没有提交COMMIT
在此事务中查询到的结果:
在这里插入图片描述
使用其他查询工具对这个未提交的数据变化进行查询:
mysql> select * from account;
±—±-----±------+
| id | name | money |
±—±-----±------+
| 1 | a | 1000 |
| 2 | b | 1000 |
±—±-----±------+
发现,数据没有变化,是没有出现脏读的情况,
这说明,在读到已提交 READ-COMMITTED 这个隔离级别下,a用户开启了事务后在没有做提交动作之前对数据的修改,其他的用户是看不到a用户对数据的修改的,因为隔离级别是读到已提交,所以是只有被提交的数据变化才能被其他用户读到。因此读到已提交 READ-COMMITTED 这个隔离级别是没有脏读的情况的。


存储过程
在这里插入图片描述
就是把自己工作中常用到或重复用到的MySQL语句打包到 一起,形成代码块,下次干活的时候,直接调用这个代码块就可以了,就不用一个语句一个语句的去手工执行了,大大减少了工作量。
一个简单的存储过程的创建和调用,

创建语句:
CREATE PROCEDURE proc()
BEGIN
SELECT * FROM student;
END;
调用语句:
call proc();

存储过程中的变量

这里是引用
在这里插入图片描述
september2024the20thFriday
DECLARE var_name[,varname]…date_type[DEFAULT value];
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个存储过程的例子:
DECLARE myvariable INT DEFAULT 100;
BEGIN
DECLARE s_grade FLOAT;
DECLARE s_gender CHAR(2);
SELECT grade,gender INTO s_grade,s_gender FROM student WHERE name=‘rose’;
SELECT s_grade,s_gender;
END;
调用存储过程
call mypr;
或者
CALL mypr();
在这里插入图片描述
在这里插入图片描述
删除存储过程
DROP PROCEDURE doiterate;
注意,删除存储过程使用的命令是PROCEDURE 并且存储过程名字后面不带小括号,
在这里插入图片描述
一个有意思的存储过程案例:
CREATE PROCEDURE doiterate()
BEGIN
DECLARE p1 INT DEFAULT 0;
my_loop:LOOP
SET p1=p1+1;
IF p1<10 THEN ITERATE my_loop;
ELSEIF p1>20 THEN LEAVE my_loop;
END IF;
SELECT p1;
END LOOP my_loop;
END
这个存储进程被call的时候,会出现10个打印结果,分别是
±-----+ | p1 |
±-----+ | 10 |
±-----+ 1 row in set (0.00 sec)

±-----+ | p1 |
±-----+ | 11 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 12 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 13 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 14 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 15 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 16 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 17 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 18 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 19 |
±-----+ 1 row in set (0.01 sec)

±-----+ | p1 |
±-----+ | 20 |
±-----+ 1 row in set (0.01 sec)
当 p1<10的时候,每次迭代(进入循环)只执行语句 ITERATE my_loop,而语句 ITERATE my_loop 下面的语句是没有被执行的,直到,p1<10 不成立的时候,才开始执行 ITERATE my_loop 下面语句 ELSEIF p1>20 THEN LEAVE my_loop ,但 p1>20 不成立,因此继续执行 下面的语句 END IF 和
SELECT p1 (这时打印的是 10),执行完 SELECT p1 是没有看到结束循环的语句的,因此,会再次进入循环,然后,再次验证 p1<10 不成立 ,开始执行 ELSEIF p1>20 THEN LEAVE my_loop ,但 p1>20 不成立,因此继续执行 下面的语句 END IF 和
SELECT p1 (这时打印的是 11),执行完 SELECT p1 是没有看到结束循环的语句的,因此,会再次进入循环,
直到打印20后,再次进入循环,SET p1=p1+1后 p1=21,执行 ELSEIF p1>20 THEN LEAVE my_loop; p1>20 条件成立,退出 循环,再关闭循环,END LOOP my_loop,最后关闭存储进程 END
注意,退出循环使用的语句是 LEAVE结束循环使用的语句是:END LOOP,两者是不一样的。
查看数据库中包含的以大C开头的所有存储进程,
SHOW PROCEDURE STATUS LIKE’C%';
在这里插入图片描述
查看数据库中存储过程创建时使用的语句
SHOW CREATE PROCEDURE chapter05.CountPr;
回显的结果是:
CREATE DEFINER=root@localhost PROCEDURE countPr(IN s_gender VARCHAR(50),OUT num INT)
BEGIN
SELECT COUNT(*) INTO num FROM student WHERE gender=s_gender;
END
在这里插入图片描述

september2024the21thSaturday

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

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

相关文章

CSS 布局三大样式简单学习

目录 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 relative 2.3 fixed 3. css 盒子模型 3.1 效果1 3.2 效果2 3.3 效果3 3.4 效果4 1. css 浮动 1.1 效果1 1.2 效果2 1.3 效果3 1.4 效果4 2. css 定位 2.1 absolute 2.2 …

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…

希尔排序(C语言实现)

目录 1.希尔排序( 缩小增量排序 ) 2.动图 ​编辑 3.代码实现 预排序实现 子序列排列实现 单趟排序实现 对整组数进行子排序 希尔排序代码 代码测试 时间复杂度分析 希尔排序的特性总结&#xff1a; 1.希尔排序( 缩小增量排序 ) 基本思想&#xff1a; 1.先选定一个…

QTCreator 调试:unknown debugger type “No engine“

QTCreator 调试&#xff1a;unknown debugger type "No engine" - kaizenly - 博客园 (cnblogs.com) 一开始Debuggers---Auto-detected这里第一row第一个项是标红的&#xff0c;然后没改东西&#xff0c;点完应用Apply以后&#xff0c;就可以调试了...&#xff08;不…

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串&#xff0c;但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化&#xff0c;在网上查找到很多说是编码问题Unicode编码然后解码什么的&#xff1b;有些是(导入的xml库而不…

深度学习之概率论预备知识点(3)

在深度学习中&#xff0c;概率论和数理统计是理解许多算法背后的理论基础。这些知识在处理不确定性、估计模型参数、理解数据分布等方面非常关键 1、概率 一种用来描述随机事件发生的可能性的数字度量&#xff0c;表示某一事件发生的可能性。 概率并不客观存在&#xff0c;是…

Android Choreographer 监控应用 FPS

Choreographer 是 Android 提供的一个强大的工具类&#xff0c;用于协调动画、绘制和视图更新的时间。它的主要作用是协调应用的绘制过程&#xff0c;以确保流畅的用户体验。Choreographer 也可以帮助我们获取帧时间信息&#xff0c;从而为性能监测和优化提供重要的数据支持。 …

IDEA中Quarkus框架(3.13版本)开发、调试、部署、打包等

code-with-quarkus code-with-quarkus 是使用官网生成的demo项目 这个项目使用Quarkus&#xff08;使用3.13.0版本&#xff0c;该版本支持JDK21&#xff09;&#xff0c;超音速亚原子Java框架。官网地址: https://quarkus.io/. 环境要求 OS: Windows 10.0 jdk 11 maven 3.9…

淘宝扭蛋机小程序,扭蛋机文化下的新体验

在数字化时代中&#xff0c;扭蛋机逐渐从传统的线下机器转移到了线上互联网中&#xff0c;市场得到了创新发展。扭蛋机小程序具有便捷、多样化、个性化的特点&#xff0c;迎合了当下消费者的线上消费习惯&#xff0c;又能够让扭蛋机玩家体验到新鲜有趣的扭蛋。 扭蛋机是一种热…

python简单的小项目-关于央行储蓄占比情况的数据可视化

该数据来源于锐思数据库&#xff0c;如果数据有偏差&#xff0c;可能是本人搜索的问题&#xff0c;希望大家谅解。 数据大纲&#xff1a; 其中我们制作折现统计图需要用到的是截止日期&#xff0c;表达数据最后获取的日期&#xff0c;而更新时间则是数据时效性的表示&#xff…

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式&#xff1a; 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…

pthread_cond_signal 和pthread_cond_wait

0、pthread_join()函数作用&#xff1a; pthread_join() 函数会一直阻塞调用它的线程&#xff0c;直至目标线程执行结束&#xff08;接收到目标线程的返回值&#xff09;&#xff0c;阻塞状态才会解除。如果 pthread_join() 函数成功等到了目标线程执行结束&#xff08;成功获取…

【C++】list详解及模拟实现

目录 1. list介绍 2. list使用 2.1 修改相关 2.2 遍历 2.3 构造 2.4 迭代器 2.5 容量相关 2.6 元素访问 2.7 操作相关 3. 模拟实现 3.1 节点类 3.1.1 初始结构 3.1.2 节点的构造函数 3.2 迭代器类 3.2.1 初始结构 3.2.2 迭代器 3.2.3 迭代器-- 3.2.4 解引…

1.随机事件与概率

第一章 随机时间与概率 1. 随机事件及其运算 1.1 随机现象 ​ 确定性现象&#xff1a;只有一个结果的现象 ​ 确定性现象&#xff1a;结果不止一个&#xff0c;且哪一个结果出现&#xff0c;人们事先并不知道 1.2 样本空间 ​ 样本空间&#xff1a;随机现象的一切可能基本…

ML 系列:机器学习和深度学习的深层次总结(05)非线性回归

图 1.不同类型的回归 一、说明 非线性回归是指因变量和自变量之间存在非线性关系的模型。该模型比线性模型更准确、更灵活&#xff0c;可以获取两个或多个变量之间复杂关系的各种曲线。 二、关于 当数据之间的关系无法用直线预测并且呈曲线形式时&#xff0c;我们应该使用非线性…

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…

6、等级保护政策内容

数据来源&#xff1a;6.等级保护政策内容_哔哩哔哩_bilibili 信息安全产品管理与响应 等级管理 对信息系统中使用的信息安全产品实行按等级管理&#xff0c;信息安全事件应分等级响应与处置。 预测评服务由测评公司和咨询公司提供预测评服务&#xff0c;根据技术要求和测评要…

高校心理辅导系统:Spring Boot技术实现指南

目 录 摘 要 I ABSTRACT II 1绪 论 1 1.1研究背景 1 1.2设计原则 1 1.3论文的组织结构 2 2 相关技术简介 3 2.1Java技术 3 2.2B/S结构 3 2.3MYSQL数据库 4 2.4Springboot框架 4 3 系统分析 6 3.1可行性分析 6 3.1.1技术可行性 6 3.1.2操作可行性 6 3.1.3经济可行性 6 3.1.4法律…

[OpenGL]使用OpenGL绘制带纹理三角形

一、简介 本文介绍了如何使用使用OpenGL绘制带纹理三角形。 在绘制带纹理的三角形时&#xff0c; 首先使用.h读取准备好的.png格式的图片作为纹理&#xff0c;然后在fragment shader中使用 ... in vec2 textureCoord; uniform sampler2D aTexture1; void main() {FragColor …

嵌入式 开发技巧和经验分享

文章目录 前言嵌入式 开发技巧和经验分享目录1.1嵌入式 系统的 定义1.2 嵌入式 操作系统的介绍1.3 嵌入式 开发环境1.4 编译工具链和优化1.5 嵌入式系统软件开发1.6 嵌入式SDK开发2.1选择移植的系统-FreeRtos2.2FreeRtos 移植步骤2.3 系统移植之中断处理2.4系统移植之内存管理2…