mysql存储过程与事务

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mysql存储过程与事务

mysql存储过程与事务

一、存储过程


1, 存储过程 -----类似函数---面向过程

2, 存储过程的定义,调用,定义变量、赋值变量,判断条件,通过使用游标、设置continue句柄,更改循环结构为repeat结构

分有参无参,其中有参(in 标志输入变量,out 标记输出变量,inout 标志既能做输入也能做输出变量)

2-1,定义存储过程procedure
(1)存储关键字:procedure,创建、删除跟表跟视图差不多

(2)创建前需要先定义存储过程结束的符号,关键字 delimiter(修改结束符,避免与默认的;矛盾)

(3)create procedure 的标志是以begin  要存储的过程(查询的过程吧) end 结束符号

(4)修改结束符号为原来的;(复原结束符)

2-2,调用存储--使用关键字call 存储过程()

 无参:call 存储过程();

有参:call存储过程(@参数1,@参数2…);

          select @参数1,@参数2…;

 

2-3,存储过程定义变量,以及赋值变量

☆也就是参数变量,局部变量那么回事,记住个关键字declare、set标志一下就行啦

其实也没啥,就是定义变量,赋值变量时,多了个标志的关键字declare、set而已。

declare 变量 变量类型;

set 变量=值;

 

2-4存储过程使用判断条件

if…then         如果怎么怎么,怎么怎么

elseif … then    否则如果怎么怎么,怎么怎么

else …          否则怎么怎么

end if;

还有结构:case when…then …end case 都一样。

 

2-5,游标:游标游标,就是循环遍历时使用啦!一般应用于存储过程内部时,查询可能返回多条记录,如果数据量大,则需要使用光标来逐条读取查询结果集的记录,跟java的结果集resultSet,通过next() 操作差不多。

(1)数据量小的情况下,游标的使用情况,直接使用在while结构

42.png

 

43.png

 

 

(2)数据量大时需要改写循环结构:改成repeat 结构 until 结束条件 end repeat;

      过程中通过定义continue句柄 for not found set 结束条件。

44.png

 

 

✿注意:游标是只读的!且只能往前滚动---下一行下一行,所以性能不高,而且使用游标容易造成死锁,造成内存开发比较大,所以游标一般使用在存储过程,函数,触发器中。

例如复制,进行数据库的维护,例如主从分离,进行数据库的优化。。。遍历取出每一行。。。

 

3, 存储过程的优缺点:

优点:

预编译执行速度快具有更好的性能存储过程经过编译之后会比单独一条一条执行要快。但这个效率真是没太大影响。如果是要做大数据量的导入、同步,我们可以用其它手段。

②创建一次可以重复使用,减少开发员的工作量

③减少网络传输,尤其是在高并发情况下,减低网络的负载。存储过程主要是在服务器上运行,减少对客户机的压力。所有的数据访问都在服务器内部进行,不需要传输数据到其它终端。但我们的用户服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速(可使用Redis缓存解决)。

④安全性:安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显式权限。(合理使用)

 

缺点:

不可移植性,由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。

② 架构不清晰,不够面向对象不是OO的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。存储过程不太适合面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,业务逻辑在存储层实现,增加了业务和存储的耦合,代码的可读性也会降低。

不便于调试。基本上没有较好的调试器,很多时候是用print来调试,但用这种方法调试长达数百行的存储过程简直是噩梦。好吧,这一点不算啥,C#/java一样能写出噩梦般的代码。

没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

无法适应数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

 

4使用建议:普通的项目开发中,不建议大量使用存储过程,对比SQL语句,存储过程适用于业务逻辑复杂,比较耗时,同时请求量较少的操作,例如后台大批量查询、定期更新等。

(1)当一个事务涉及到多个SQL语句时或者涉及到对多个表的操作时可以考虑应用存储过程

(2)在一个事务的完成需要很复杂的商业逻辑时可以考虑应用存储过程

(3)比较复杂的统计和汇总可以考虑应用后台存储过程

 

 

二、事务


 

所谓事务:不过是把多条语句一起,通过transaction 结构…一起commit 过去。

 

实际应用场景:是把事务放到存储过程中的。

1,事务是多个操作作为一个整体,要么都执行,要么都不执行。

(默认情况下,每条sql语句视为独立的一个事务)

而我们为了发挥事务的作用:需要实现多条操作共同执行,共同不执行的结果(设置多条语句为一个事务)

-----自动提交关键字:          autocommit

设置事务不再自动提交                   set autocommit=0

事务执行完毕后再设置回事务自动提交  set autocommit=1;

 

2事务的提出主要是为了解决并发情况下保持数据一致性的问题(类似于多线程)。事务(Transaction)是并发控制的基本单位!

45.png

 

 

3,✿事务使用注意小细节:如果是表要使用到事务,表的搜索引擎需要设置为InnoDB

46.png

 

4事务:

开始事务:start transaction

结束事务方式:提交或回滚(根据条件回滚)

  •提交事务:commit

  •回滚/撤销事务:rollback

 

 

5,事务关闭方式之根据条件回滚:条件有业务逻辑条件,也有sql语法或逻辑错误异常【sql异常】

 

6,事务特(属)性(ACID)

原子性:整体的操作里,各部分操作不可分割,要么都执行,要么都不执行。操作成功应用到数据库,失败---回滚

一致性:操作执行前后保持状态一致,例如银行转账问题:总余额保持不变。

隔离性:多个用户并发访问数据库时,多个并发事务之间要相互隔离开。例如不同用户同时向商家支付,用户之间的各自操作要隔离开来,不受其他用户操作的影响。

持久性:成功操作后,就提交到数据库啦(数据库的改变是永久的)

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
29天前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
97 43
|
20天前
|
存储 SQL NoSQL
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1636 14
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
35 5
|
1月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
52 3
|
1月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
61 1
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】索引和事务
【MySQL】索引和事务
54 0
|
10天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
25 1
|
12天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
28 4