当前位置: 首页 > news >正文

【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

目录

  • 1. 题目
    • 1.1 存储过程
    • 1.2 存储函数
    • 1.3 事务处理
  • 2. 解答
    • 2.1 存储过程
    • 2.2 存储函数
    • 2.3 事务处理

1. 题目

1.1 存储过程

  1. 创建表 RandNumber :字段:id 自增长, data int; 创建存储过程向表中插入指定个数的随机数(1-99),但如果插入的数为 50,则终止插入。

  2. 创建存储过程,根据员工的工作时间,如果大于 6 年时,将其转到经理办公室工作,并调用该存储过程。

  3. 创建存储过程,比较两个员工的实际收入,若前者比后者高输出 1,若两者相等输出 0,若后者比前者高输出 -1,并调用该存储过程。

  4. 创建存储过程 p(in name char(10),out income decimal(7,2)),计算一个员工的实际收入,并调用该存储过程,将员工 朱骏 的实际收入保存在一个用户变量中。

  5. 创建存储过程 raise(in edu char(6),in x decimal(5,1)) 将所有某种学历的员工的收入提高 %x, 并调用该存储过程,将所有硕士学历的员工的收入提高 10%

1.2 存储函数

  1. 创建存储函数 getAver(did int),计算某个部门的平均工资(实际收入);

  2. 调用该函数,显示平均工资最高和最低的部门名称。

1.3 事务处理

设置事务处理为手动提交建立两个连接

  1. 观察 @@transaction_isolation 设置为 read-uncommited 时,脏读的情况。
    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 read-uncommited,开始事务,显示 employees 表中‘ 王林 ’员工信息;
    2)在另一个连接 B 中,修改‘ 王林 ’的 workYear10 年;
    3)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear
    4)在一个连接 B 中,回滚刚才的修改操作;
    5)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear

  2. 观察 @@transaction_isolation 设置为 read-commited 时,不可重复读的情况。
    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 read-commited
    2)开始事务,显示 employees 表中‘王林’员工信息;
    3)在另一个连接 B 中,修改‘王林’的 workYear10 年;
    4)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear
    5)在一个连接 B 中,提交刚才的修改操作;
    6)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear,提交事务。

  3. 观察 @@transaction_isolation 设置为 repeatable-read 时,幻读的情况。
    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 repeatable-read
    2)开始事务,显示 employees 表中所有员工信息,观察记录的数目;
    3)在另一个连接 B 中,在 employees 表插入一条记录,并提交事务;
    4)在连接 A 中显示 employees 表的员工信息,观察记录的数目;
    5)在连接 A 中,将所有员工的 workYear 增加一年,观察被修改的记录的数目;
    6)在连接 A 中提交事务;
    8)在连接 A 再次显示 employees 表中所有员工信息,观察记录的数目;

  4. 设置@@transaction_isolation 设置为 serializable
    重复第 3 个实验的操作,观察操作中出现的现象。

2. 解答

2.1 存储过程

use yggl;
  1. 创建表 RandNumber :字段:id 自增长, data int; 创建存储过程向表中插入指定个数的随机数(1-99),但如果插入的数为 50,则终止插入。

    drop table if EXISTS `yggl`.`RandNumber`;
    CREATE TABLE if not EXISTS`yggl`.`RandNumber`  (`id` int NOT NULL AUTO_INCREMENT,`data` int NOT NULL,PRIMARY KEY (`id`)
    );drop PROCEDURE if EXISTS p_RandNumber;
    delimiter $
    create procedure p_RandNumber(in n int)
    begindeclare temp int;declare i int default(1);set temp = 1 + floor(rand()*99);while i <= n and temp != 50 doinsert into randnumber values (null, temp);set temp = 1 + floor(rand()*99);set i = i + 1;end while;
    end$
    delimiter ;set @n=100;
    call p_RandNumber(@n);
    select * from randnumber;
    
  2. 创建存储过程,根据员工的工作时间,如果大于 6 年时,将其转到经理办公室工作,并调用该存储过程。

    drop PROCEDURE if EXISTS p2;
    delimiter $
    create procedure p2()
    begindeclare did char(3);  # 部门编号declare eid char(6);  # 员工编号select departments.DepartmentID into didfrom departmentswhere departments.DepartmentName = '经理办公室';select employees.EmployeeID into eidfrom employeeswhere employees.WorkYear > 6;update employeesset DepartmentID = didwhere employees.EmployeeID in(eid);
    end$
    delimiter ;call p2();
    
  3. 创建存储过程,比较两个员工的实际收入,若前者比后者高输出 1,若两者相等输出 0,若后者比前者高输出 -1,并调用该存储过程。

    drop PROCEDURE if EXISTS p3;
    delimiter $
    create procedure p3(in mname1 char(10), in mname2 char(10))
    begindeclare m1 float;  # 第一个人的实际收入declare m2 float;  # 第二个人的实际收入declare flag int;  # 1,0,-1select salary.InCome - salary.OutCome into m1from salary join employees on salary.EmployeeID = employees.EmployeeIDwhere employees.`Name` = mname1;select salary.InCome - salary.OutCome into m2from salary join employees on salary.EmployeeID = employees.EmployeeIDwhere employees.`Name` = mname2;if m1 > m2 thenset flag = 1;elseif m1 = m2 thenset flag = 0;elseset flag = -1;end if;select flag;
    end$
    delimiter ;call p3('王浩', '伍容华');
    
  4. 创建存储过程 p(in name char(10),out income decimal(7,2)),计算一个员工的实际收入,并调用该存储过程,将员工 朱骏 的实际收入保存在一个用户变量中。

    drop PROCEDURE if EXISTS p;
    delimiter $
    create procedure p(in `name` char(10),out income decimal(7,2))
    beginselect salary.InCome - salary.OutCome into incomefrom salary join employees on salary.EmployeeID = employees.EmployeeIDwhere employees.`Name` = `name`;end$
    delimiter ;set @c=1;
    call p('朱骏', @c);
    select @c;
    
  5. 创建存储过程 raise(in edu char(6),in x decimal(5,1)) 将所有某种学历的员工的收入提高 %x, 并调用该存储过程,将所有硕士学历的员工的收入提高 10%

    drop PROCEDURE if EXISTS raise;
    delimiter $
    create procedure raise(in edu char(6), in x decimal(5,1))
    beginupdate salaryset salary.InCome = salary.InCome*(1+x/100)where EmployeeID in(select employees.EmployeeIDfrom employeeswhere employees.Education = edu);
    end$
    delimiter ;call raise('硕士', 10);
    

2.2 存储函数

  1. 创建存储函数 getAver(did int),计算某个部门的平均工资(实际收入);

    set GLOBAL log_bin_trust_function_creators = 1;    # 一共只需要设置一次drop FUNCTION if exists getAver;
    delimiter $
    create FUNCTION getAver(did int)
    returns float    # 返回某个部门的平均工资(实际收入)
    begindeclare aver float;select AVG(salary.InCome - salary.OutCome) into averfrom employees join salary on employees.EmployeeID = salary.EmployeeIDwhere employees.DepartmentID = did;return aver;
    end$
    delimiter ;
    
  2. 调用该函数,显示平均工资最高和最低的部门名称。

    # 平均工资最高的部门
    select departments.DepartmentName, getAver(departments.DepartmentID) as avg_salary
    from departments
    ORDER BY avg_salary desc
    limit 1;
    # 平均工资最低的部门
    select departments.DepartmentName, getAver(departments.DepartmentID) as avg_salary
    from departments
    ORDER BY avg_salary asc
    limit 1;
    

2.3 事务处理

设置事务处理为手动提交建立两个连接

set @@autocommit = 0;

在这里插入图片描述

  1. 观察 @@transaction_isolation 设置为 read-uncommited 时,脏读的情况。
    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 read-uncommited,开始事务,显示 employees 表中‘ 王林 ’员工信息;

    在这里插入图片描述

    2)在另一个连接 B 中,修改‘ 王林 ’的 workYear10 年;

    在这里插入图片描述

    3)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear

    在这里插入图片描述

    4)在一个连接 B 中,回滚刚才的修改操作;

    在这里插入图片描述

    5)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear

    在这里插入图片描述

    结论:一个事务 B 读取了另一个未提交的并行事务 A 写的数据。【脏读】

  2. 观察 @@transaction_isolation 设置为 read-commited 时,不可重复读的情况。
    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 read-commited

    在这里插入图片描述

    2)开始事务,显示 employees 表中‘王林’员工信息;

    在这里插入图片描述

    3)在另一个连接 B 中,修改‘王林’的 workYear10 年;

    在这里插入图片描述

    4)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear

    在这里插入图片描述

    5)在一个连接 B 中,提交刚才的修改操作;

    在这里插入图片描述

    6)在连接 A 中显示 employees 表的员工信息,观察‘王林’的 workYear,提交事务。

    在这里插入图片描述

    结论:一个事务A重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务B修改过。【不可重复读】

  3. 观察 @@transaction_isolation 设置为 repeatable-read 时,幻读的情况。
    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 repeatable-read

    在这里插入图片描述

    2)开始事务,显示 employees 表中所有员工信息,观察记录的数目;

    在这里插入图片描述

    3)在另一个连接 B 中,在 employees 表插入一条记录,并提交事务;

    在这里插入图片描述

    4)在连接 A 中显示 employees 表的员工信息,观察记录的数目;

    在这里插入图片描述

    5)在连接 A 中,将所有员工的 workYear 增加一年,观察被修改的记录的数目;

    在这里插入图片描述

    6)在连接 A 中提交事务;

    在这里插入图片描述

    7)在连接 A 再次显示 employees 表中所有员工信息,观察记录的数目;

    在这里插入图片描述

    结论:一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。【幻读】

  4. 设置@@transaction_isolation 设置为 serializable
    重复第 3 个实验的操作,观察操作中出现的现象,即:

    1)在一个连接 A 中,设置 @@transaction_isolation 设置为 serializable

    在这里插入图片描述

    2)开始事务,显示 employees 表中所有员工信息,观察记录的数目;

    在这里插入图片描述

    3)在另一个连接 B 中,在 employees 表插入一条记录,并提交事务;

    在这里插入图片描述

    4)在连接 A 中显示 employees 表的员工信息,观察记录的数目;

    在这里插入图片描述

    5)在连接 A 中,将所有员工的 workYear 增加一年,观察被修改的记录的数目;

    在这里插入图片描述

    6)在连接 A 中提交事务;

    在这里插入图片描述

    7)在连接 A 再次显示 employees 表中所有员工信息,观察记录的数目;

    在这里插入图片描述

    结论:对于同一个数据来说,在同一个时间段内,只能有一个会话可以访问,包括SELECT和DML,这样可以避免幻读问题。也就是说,对于同一(行)记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。【可序列化】

上一篇文章:【数据库——MySQL】(14)过程式对象程序设计——游标、触发器
下一篇文章:【数据库——MySQL】(16)游标和触发器习题及讲解

相关文章:

【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

目录 1. 题目1.1 存储过程1.2 存储函数1.3 事务处理 2. 解答2.1 存储过程2.2 存储函数2.3 事务处理 1. 题目 1.1 存储过程 创建表 RandNumber &#xff1a;字段&#xff1a;id 自增长&#xff0c; data int&#xff1b; 创建存储过程向表中插入指定个数的随机数&#xff08;1-…...

FFmpeg:打印音/视频信息(Meta信息)

多媒体文件基本概念 多媒体文件其实是个容器在容器里面有很多流(Stream/Track)每种流是由不同的编码器编码的从流中读出的数据称为包在一个包中包含着一个或多个帧 几个重要的结构体 AVFormatContextAVStreamAVPacket FFmpeg操作流数据的基本步骤 打印音/视频信息(Meta信息…...

1.Linux入门基本指令

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 01.ls指令 02.pwd指令 03.cd指令 04.touch指令 05.mkdir指令(重要) 06.rmdir&&rm指令(重要) 07.man指令(重要) 08.cp指令(重要) 09.mv指令(重要) 10.cat指令 nano指令 echo指令 输出重定向 追加重…...

2023腾讯云服务器优惠代金券领取、查询及使用说明

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…...

大华智慧园区管理平台任意密码读取漏洞 复现

文章目录 大华智慧园区管理平台任意密码读取漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 大华智慧园区管理平台任意密码读取漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&…...

【C++ 学习 ㉖】- 位图详解(哈希扩展)

目录 一、位图的概念 二、位图的实现 2.1 - bitset.h 2.2 - test.cpp 三、位图的应用 3.1 - 例题一 3.2 - 例题二 一、位图的概念 假设有这样一个需求&#xff1a;在 100 亿个整型数字中快速查询某个数是否存在其中&#xff0c;并假设是 32 位操作系统&#xff0c;4 GB…...

天启科技联创郭志强:趟遍教育行业信数化沟坎,创业智能赛道重塑行业生态

郭志强 天启科技联合创始人 近20年互联网、企业信息化、数字化实施、管理及培训经验。对于集团型企业及初创企业、传统企业及互联网企业的信息化、数字化转型有自己独到的见解和实操经验。具备跨区域、集团化信息规划、解决方案、系统架构及企业流程搭建、优化和技术团队管理能…...

Cuckoo沙箱各Ubuntu版本安装及使用

1.沙箱简介 1.1 沙箱 沙箱是一个虚拟系统程序&#xff0c;允许你在沙箱环境中运行浏览器或其他程序&#xff0c;因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境&#xff0c;在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中&#xff…...

什么是mvvm模式,优点是什么

MVVM&#xff08;Model-View-ViewModel&#xff09;模式是一种设计模式。它是一种开发模式&#xff0c;旨在分离用户界面的开发和业务逻辑的开发。MVVM模式将应用程序分为三个部分&#xff1a; Model&#xff1a;它代表应用程序的数据模型和业务逻辑。 View&#xff1a;它代表…...

C/C++ 中的函数返回局部变量以及局部变量的地址?

C/C中&#xff0c;函数内部的一切变量(函数内部局部变量&#xff0c;形参)都是在其被调用时才被分配内存单元。形参和函数内部的局部变量的生命期和作用域都是在函数内部(static变量的生命期除外)。子函数运行结束时&#xff0c;所有局部变量的内存单元会被系统释放。在C中&…...

springboot和vue:七、mybatis/mybatisplus多表查询+分页查询

mybatisplus实际上只对单表查询做了增强&#xff08;速度会更快&#xff09;&#xff0c;从传统的手写sql语句&#xff0c;自己做映射&#xff0c;变为封装好的QueryWrapper。 本篇文章的内容是有两张表&#xff0c;分别是用户表和订单表&#xff0c;在不直接在数据库做表连接的…...

【Leetcode】 51. N 皇后

按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种…...

Java数据库连接:JDBC介绍与简单示例

Java数据库连接&#xff1a;JDBC介绍与简单示例 在Java程序中&#xff0c;操作数据库是必不可少的。JDBC&#xff08;Java Database Connectivity&#xff09;是Java中用于连接和操作数据库的一种技术。通过JDBC&#xff0c;Java程序可以与各种关系型数据库进行交互&#xff0…...

智慧茶园:茶厂茶园监管可视化视频管理系统解决方案

一、方案背景 我国是茶叶生产大国&#xff0c;茶叶销量全世界第一。随着经济社会的发展和人民生活水平的提高&#xff0c;对健康、天然的茶叶产品的消费需求量也在逐步提高。茶叶的种植、生产和制作过程工序复杂&#xff0c;伴随着人力成本的上升&#xff0c;传统茶厂的运营及…...

springboot整合pi支付开发

pi支付流程图&#xff1a; 使用Pi SDK功能发起支付由 Pi SDK 自动调用的回调函数&#xff08;让您的应用服务器知道它需要发出批准 API 请求&#xff09;从您的应用程序服务器到 Pi 服务器的 API 请求以批准付款&#xff08;让 Pi 服务器知道您知道此付款&#xff09;Pi浏览器向…...

类 ChatGPT 模型存在的局限性

尽管类ChatGPT模型经过数月的迭代和完善&#xff0c;已经初步融入了部分领域以及人们的日常生活&#xff0c;但目前市面上的产品和相关技术仍然存在一些问题&#xff0c;以下列出一些局限性进行详细说明与成因分析&#xff1a; 1&#xff09;互联网上高质量、大规模、经过清洗…...

Nginx的安全控制

安全控制 关于web服务器的安全是比较大的一个话题&#xff0c;里面所涉及的内容很多&#xff0c;Nginx反向代理是安全隔离来提升web服务器的安全&#xff0c;通过代理分开了客户端到应用程序服务器端的连接&#xff0c;实现了安全措施。在反向代理之前设置防火墙&#xff0c;…...

字符串与字符编码 - GO语言从入门到实战

字符串与字符编码 - GO语言从入门到实战 字符串 与其他主要编程语⾔的差异 基本数据类型&#xff1a;string 是基础数据类型&#xff0c;而不是引用类型或指针类型。string 在内存中占用的空间大小是固定的&#xff0c;且只读、不可改变。字节切片&#xff1a;string 是只读…...

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller

12P4375X042-233C KJ2005X1-BA1 CE3007 EMERSON servo controller 我们提供三种不同类别的EDGEBoost I/O模块供选择&#xff0c;以实现最大程度的I/O定制: 数字和模拟输入/输出网络和连接边缘人工智能和存储 利用EDGEBoost I/O实现变革性技术 EBIO-2M2BK EBIO-2M2BK载板支持…...

WPF向Avalonia迁移(四、其他事项)

开发必备 1. Avalonia项目源代码&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;没有源代码&#xff0c;你连控件的背景色怎么改都找不着&#xff01;&#xff01; 2.下载你所使用的版本&#x…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...