MySQL record 06 part

事务、存储过程
事务:

这里是引用
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.xdnf.cn/news/1541873.html

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

相关文章

【iOS】KVC的学习

【iOS】KVC的学习 文章目录 【iOS】KVC的学习前言KVC定义KVC设值KVC取值KVC使用keyPathKVC处理异常处理nil异常 KVC的一些应用修改动态的设置值实现高阶的消息传递 小结 前言 笔者简单学习了有关与KVC的相关内容&#xff0c;这里写一篇博客简单介绍一下相关内容。 KVC 定义 KV…

saas收银系统源码

1. 线下门店多样化收银 ①门店有社区小店、也会有大店&#xff0c;甚至还会有夫妻店&#xff0c;同时还要有Windows版和安卓版&#xff0c;需满足不同门店的收银需求。 ②支持Windows收银、安卓收银、无人自助收银、聚合码收银等&#xff0c;支持ai智能称重、收银称重一体机等…

『功能项目』QFrameWorkBug拖拽功能【66】

我们打开上一篇65QFrameWork道具栏物品生成的项目&#xff0c; 本章要做的事情是实现物品的拖拽功能 修改脚本&#xff1a;UISlot.cs 实现接口后编写脚本&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace QFramework {publi…

Netty+HTML5+Canvas 网络画画板实时在线画画

采用Html5的canvas做前端画画板&#xff0c;发送数据到后端Netty服务&#xff0c;实时转发笔迹数据&#xff0c;在线实时同步画笔轨迹&#xff0c;单击绿色小方块&#xff0c;保存画板的图片 页面&#xff1a; <!-- index.html --><!DOCTYPE html> <html> …

[Linux]:信号(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 信号的阻塞 1.1 基本概念 信号被操作系统发送给进程之后&#xff0c;进程…

机器学习05-聚类算法(python)SC(轮廓系数)详解

# 导入必要的库 from sklearn.cluster import KMeans # 导入 KMeans 聚类算法 import matplotlib.pyplot as plt # 导入 matplotlib 用于绘图 from sklearn.datasets import make_blobs # 导入 make_blobs 用于生成模拟数据 from sklearn.metrics import silhouette_score …

react:组件通信

组件通信 父组件向子组件通信 function App() {return (<div><div>这是父组件</div><Child name"这是子组件" /></div>); }// 子组件 function Child(props) {return <div>{props.name}</div>; }props说明 props可以传…

浅谈计算机视觉的学习路径1

计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能领域的一个重要分支&#xff0c;它的目标是使计算机能够像人类一样理解和处理图像和视频数据。 面向想要从事该方向的大学生&#xff0c;笔者这里给出以下是关于计算机视觉的学习路径建议&#xff1a; 简要了解…

Linux开发工具(git、gdb/cgdb)--详解

目录 一、Linux 开发工具分布式版本控制软件 git1、背景2、使用 git&#xff08;1&#xff09;预备工作——安装 git&#xff1a;&#xff08;2&#xff09;克隆远程仓库到本地&#xff08;3&#xff09;把需要提交的代码拷贝到本地仓库&#xff08;4&#xff09;提交本地仓库文…

一种新的电子邮件攻击方式:AiTM

新的攻击组利用合作伙伴组织之间的信任关系来绕过多重身份验证。 一种新的攻击方式开始出现&#xff0c;它利用合作伙伴组织之间的信任关系绕过多重身份验证。在一个利用不同组织之间关系的攻击中&#xff0c;攻击者成功地对四家或更多组织进行了商业电子邮件欺诈(BEC)攻击&…

VM-Ubantu中使用vscode头文件报错——解决办法

问题 系统中头文件明明存在但是却报错 解决方法 在报错的文件中点击&#xff0c;shift ctrl p选择Edit Configurations(JSON) 修改文件内容 原文件内容 修改之后的内容 {"configurations": [{"name": "Linux","includePath":…

计算机毕业设计推荐-基于python大数据的个性化图书数据可视化分析

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、个性化图书数据可视化分析-项…

828华为云征文 | 云服务器Flexus X实例:开源项目 LangChain 部署,实例测试

目录 一、LangChain 介绍 二、部署 LangChain 2.1 安装 langchain 2.2 安装 langchain_community 2.3 安装 qianfan 三、实例运行 3.1 Chat Models 3.2 LLMs 3.3 Embedding Models 四、总结 本篇文章主要通过 Flexus云服务器X实例 部署开源项目 LangChain&#xff0c…

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表)

【每日一题】LeetCode 2374.边积分最高节点&#xff08;图、哈希表&#xff09; 题目描述 给定一个有向图&#xff0c;图中包含 n 个节点&#xff0c;节点编号从 0 到 n - 1。每个节点都有一个出边&#xff0c;指向图中的另一个节点。图由一个长度为 n 的整数数组 edges 表示…

【Linux学习】基本指令其一

命令行界面 命令行终端是一个用户界面&#xff0c;允许用户通过输入文本命令与计算机系统进行交互。 比如Windows下&#xff0c; 键入winR&#xff0c;然后输入cmd&#xff0c;就可以输入文本指令与操作系统交互了。 Windows有另一个命令行界面Powershell,它的功能比cmd更强大…

江协科技STM32学习- P15 TIM输出比较

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

【开源】LVGL+FreeRTOS 基于STM32F411CEU6的健康助手项目制作

视频演示 【开源】LVGLFreeRTOS 基于STM32F411的智能健康助手小项目 网盘链接在最底下&#xff01;&#xff01;&#xff01;无套路&#xff01;&#xff01;&#xff01;直接分享&#xff01;&#xff01;&#xff01; 硬件介绍 STM32F411CEU6 主控 TFT 1.8inch 显示屏 DTH…

WebGL缓冲区

一、缓冲区对象 缓冲区对象时WebGL系统中的一块内存区域&#xff0c;可以一次性地向缓冲区对象中填充大量的顶点数据&#xff0c;然后将这些数据保存其中&#xff0c;供顶点着色器使用。 类型化数组 这样程序可以预知数组中的类型&#xff0c;提高性能 类型描述Int8Array8位…

数据湖 Data Lake-概述

Data Lake 1. 数据湖的定义 数据湖是一种存储系统&#xff0c;用于集中存储大量的原始数据&#xff0c;可以按数据本来的原始格式进行存储&#xff0c;用户可以在需要时提取和分析这些数据。 A data lake is a centralized repository designed to hold vast volumes of data …

JavaScript高级进阶(三)

DOM-改变HTML 语法与说明 document.write() //改变HTML输出流&#xff0c;整个页面进行重绘。 操作对象.innerHTML新的HTML //改变HTML内容 操作对象.attribute新属性值 //改变HTML属性 对象.style.property新样式 //改变操作样式的属性 注意: document.write(),优先级太高&am…