事务与存储过程
admin
2023-04-20 10:03:44
0

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()
begin
declare ep1 int default 0;
declare ep2 int default 7;
east_p:LOOP
set 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)LEAVE

LEAVE label #退出循环

(5)ITERATE
ITERATE label #再次循环,回到开头

(6)REPEAT

[repeat_lable:] REPEAT
     statement_list
UNTIL 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;

相关内容

热门资讯

“一次愉快的会晤”,泽连斯基披... 在俄乌互相加大对对方纵深目标打击之际,乌克兰总统泽连斯基7月28日造访了白宫,与美国总统特朗普举行会...
总统连遭“逼宫”,少帅临危受命 躲避着燃烧瓶和火箭弹袭击,四辆苏制BMP步兵战车快速穿行在马里乌波尔市区。即将出城的路口,迎面出现1...
独居女子在卧室玩偶内发现摄像头... 租房独居女子意外发现家中玩偶内藏着偷拍设备,报警后偷拍设备竟“不翼而飞”,门锁记录显示有人在她出门的...
伊学者:乌克兰袭击行动适得其反... 乌克兰袭击与伊朗有关的船只后,伊朗和俄罗斯接连作出强硬回应。伊朗外交学院教授法拉吉扎德在接受凤凰卫视...
20万人怒火不会停!蓝议员挺蒋... 海峡导报综合报道 在蓝白号召台湾民众上凯道呐喊“反毒台”后,台北市长蒋万安日前透露,近日不少民代私下...
柯文哲妻子陈佩琪畅游大陆,民进... 台湾民众党前主席柯文哲妻子陈佩琪27日在脸书发文证实,自己早前由儿子陪同前往上海、杭州与北京旅游一周...
高市早苗被问如何改善中日关系 据日本东京新闻报道,当地时间7月27日,日本首相高市早苗在首相官邸举行记者会。当被问及如何改善中日关...
扎哈罗娃批小泉进次郎涉核言论:... 【环球网报道 记者 张江平】综合俄新社等媒体报道,对于日本防卫大臣小泉进次郎涉核言论,俄罗斯外交部发...
“特高课”再现?日本强推“国家... 无视反对战争正义呼声 复刻战前军国主义体制日本强推“国家情报局”引发广泛担忧和批评(国际视点)本报记...
6G相比5G不只是速度更快 将...   6G相比5G不只是速度更快  【6G相比5G不只是速度更快】7月28日,相比5G,6G不仅是速度...