千家信息网

事务与存储过程

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,1.事务管理**(1)概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。(2)MySQL默认就自带事务,但是MySQL自带的事务是一条语句独占一个事务(3)也可以自己
千家信息网最后更新 2025年01月22日事务与存储过程

1.事务管理

**(1)概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

(2)MySQL默认就自带事务,但是MySQL自带的事务是一条语句独占一个事务

(3)也可以自己控制事务:**

star transcation; --开启事务,在这条语句之后的sql将处在同一个事务中
...........
...........#语句
commit; #提交事务,让这个事务中的sql对数据库的影响立即发生
rollback; #回滚事务,测回

create table account(
id int primary key auto_increment,
name varchar(40),
money double

);

insert into account values(null,'赖泽铵',2000),(null,'侯文泽',1000);

**(4)
原子性:事务时一组不可分割的单位,要么同时成功要么同时不成功。

一致性:事务前后的数据完整性应该保持一致

隔离性:多个用户并发访问数据库时,一个用户的事务不能被其他用户事务干扰。

持久性:一旦提交,数据的改变将是永久性

隔离性:本质就是多个线程操作同一个资源造成的多线程并发安全问题,加锁可以保证隔离性,但是造成数据库性能下降

如果两个事务并发的修改:必须隔离
如果两个事务并发查询:不用隔离
如果一个事务修改一个查询:脏读#中途撤销,不可重复读#中途修改,虚读#新增内容**

四大隔离:
read uncommitted #不隔离
read committed #可以防止脏读
Repeatable read #不能防止虚读,只能读到开始时间事务的数据,想查看之后时间的数据只能终止事务才能看到
Serializable #数据库运行在串行化未实现 ,性能低,直接锁住,对方不能修改,待事务结束。

默认Repeatable read

设置语句:

SET SESSION TRANSCATION ISOLATION LEVEL 隔离等级;

查询语句:

select @@tx_isolation; #上面语句执行成功后

2.存储过程的创建

重复使用某一功能的情况,减少工作量

(1) 语法:

CREATE PROCEDURE sp_name([proc_parameter])
[characteristics...] routine_body

~proc_parameter#参数列表
形式:[IN | OUT | INOUT]param_name#参数名称 type#参数类型

~characteristics#存储特性

LANGUAGE SQL:说明routine_body部分由SQL语句组成

[NOT]DETERMINISTIC:指明存储过程执行的结果是否确定。默认NOT

{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}:分别是包含SQL语句但不包含读写数据语句,不包含SQL语句,读写数据语句,写数据语句。
默认CONTAINS SQL

SQL SECURITY {DEFINER | INVOKER}:指明谁有权限来执行,DEFINER 表示只有定义者才能执行,INVOKER 表示拥有权限的调用者可以执行。
默认 DEFINER

COMMENT'string':注释信息,可以用来描述存储过程

~routine_body:SQL语句,
DELIMITER // #将结束符定义为//
BEGIN
.....
......
END

delimiter //

create procedure nbaf()
begin
select from team left join star on team.id = star.team_id
union
select
from team right join star on team.id = star.team_id;
end//

delimiter ;

call nbaf();

(2)在存储过程中定义一个变量
变量的声明一定要在存储过程的BEGIN和END之间,作用范围是当前的存储范围

DECLARE var_name [,varname]...data_type [DEFAULT value];

修改变量值1:
SET var_name = expr[,var_name = expr]#表达式赋予给.....;

修改变量值2:
SELECT col_name [...]#数据 into#复制 var_name [....]#变量 table_expr#查询条件;

delimiter //

create procedure pf(in p_id int)
begin
select from team left join star on team.id = star.team_id where team.id = p_id
union
select
from team right join star on team.id = star.team_id where team.id = p_id;
end//

delimiter ;

call pf();

3.定义条件和处理程序

(1)定义条件:是事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式,并且保证存储过程中遇到警告或错误时能继续执行。
DECLARE condition_name CONDITION FOR [condition_type];

condition_type 的两种形式:
[condition_type]:
SQLSTATE[VALUE] sqlstate_value | mysql_error_code

sqlstate_value:是长度为5的字符串类型错误代码,
mysql_error_code:为数值类型的错误代码
例如:ERROR1142(42000) ,sqlstate_value:42000,mysql_error_code:1142

(2)定义处理程序
DECLARE handler_type HANDER FOR condition_value[,...] sp_statement

handler_type:CONTINUE | EXIT | UNDO#遇到错误撤回之前的操作,但是MySQL不支持

condition_value:

SQLSTATE[VALUE] sqlstate_value:包含5个字符的字符串错误值
condition_name :错误条件名称
SQLWARNING :匹配所有以01开头的SQLSTATE错误代码
NOT FOUND :匹配所有以02开头的SQLSTATE错误代码
SQLEXCEPTION :匹配所有除01,02开头外的SQLSTATE错误代码
mysql_error_code :匹配数值类型的错误代码

定义处理程序的几种方式

declare continue handler for SQLSTATE '42S02' set @info= 'NO_SUCH_TABLE' ; #info输出

declare continue handler for 1146 set @info= 'NO_SUCH_TABLE' ; #1146,捕获mysql_error_code

declare no_such_table condition for 1146;
declare continue handler for NO_SUCH_TABLE set @info= 'ERROR' ; #先定义条件,然后调用

declare exit handler for SQLWARNING set @info= 'ERROR' ;

declare exit handler for NOT FOUND set @info= 'NO_SUCH_TABLE' ;

declare exit handler for SQLEXCEPTION set @info= 'ERROR' ;

4.光标的使用:数据量非常大时使用光标逐条查询

(1)光标的声明:在声明变量、条件后,声明处理程序之后

DECLARE cursor_name CURSOR FOR select_statement

(2)光标的使用
打开光标:
OPEN cursor_name;
FETCH cursor_name INTO var_name [,var_name]....
关闭光标:
CLOSE curse_name

5.控制流程的使用:在编写存储过程中

(1)IF语句:
IF expr_condition THEN statement_list
[ELSEIF expr_contidion THEN statement_list]
[ELSE statement_list]
END IF
//expr_condition 判断语句 statement_list SQL语句

(2)CASE语句:
CASE case_expr
WHEN when_value THEN statement_list
[ WHEN when_value THEN statement_list]
............
[ELSE statement_list]
END CASE;

(3) LOOP语句:
[loop_table:] LOOP
statement_list
END LOOP [loop_tabel];

                    //loop_table表示标注名称,可以省略----------------------------------------------------------------------------------------------------------------------------------

delimiter //

create procedure east()begindeclare ep1 int default 0;declare ep2 int default 7;east_p:LOOPset ep1 = ep1 + 1;if ep1< 4 then  select * from team left join star on team.id = star.team_id  where team.id = ep1     union     select * from team right join star on team.id = star.team_id where team.id = ep1;else leave loop;end if;end LOOP esat_p;end//delimiter ;call east();//不会用------------------------------------------------------------(4)LEAVELEAVE label #退出循环(5)ITERATEITERATE label #再次循环,回到开头(6)REPEAT[repeat_lable:] REPEAT     statement_listUNTIL expr_condition                  #直到判断语句为真退出END REPEAT[repeat_lable]

(7)WHILE

[while_lable:] WHEIL expr_condition DO
statement_list
END WHILE [while_lable]

6.调用存储过程

(1)执行存储过程

CALL sp_name([parameter[.....]])

7.查看存储过程

(1)SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

show procedure status;

show procedure status like 'nbaf';

show procedure status like '%f'\G #查看以f结尾的存储过程

8.修改存储过程

ALTER {PROCEDURE | FUNCTION } sp_name [characteristic....]
#characteristic表示要修改的存储过程的哪个部分,取值如下
~CONTAINS SQL
~NO SQL
~READS SQL DATA #读数据
~MODIFIES SQL DATA #写数据
~SQL SECURITY { DEFINER | INVOKER}
~COMMENT'string' #注释

目前MySQL还不提供对已经存在的存储过程代码进行修改,要修改先删除

9.删除存储过程

DROP {PROCEDURE | FUNCTION } [IF EXISTS] sp_name;

事务 语句 存储 过程 数据 错误 隔离 代码 光标 条件 程序 处理 成功 查询 变量 开头 数据库 类型 参数 名称 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 杭州超声波液位计电路板软件开发 怎么下载管理服务器 网络技术填空题及答案 小火箭服务器节点购买网址 psn中国服务器 如何在家里用网吧服务器连接pc 教育网络安全的黄埔军校 网络安全人员任命文件 网络安全管理局领导班子 软管理服务器部分文件被破坏 ssh怎么看远程服务器的空间 服务器怎么给新玩家tag 北京信息科技大学数据库答案 用python操作数据库 网络安全性的问题怎么办 涟源租房软件开发 建一个电脑服务器机房要多少钱 数据库表的数据都是问号 网络安全基本因素包括以下 企业网络安全防护课本 应用服务器部署数据服务缺点 psn中国服务器 滴滴云服务器干什么用 鹏辉网络技术工作室 软件开发面试选择题 数据库查询一个字段中的值 网络安全国内外研究概述 网络安全绘画图简单 儿童 域服务器管理客户机报错 宁远县网络安全执法局
0