数据库(4)
事务(Transaction)
事务就是一系列连续的操作,当这所有操作成功完成就可以提交事务(即持久化事务),如果其中任何一个操作失败,就可以立即回滚到事务的开始状态,就像什么都没发生一样
事务具有ACID四大特性:A代表原子性,C代表一致性,I代表隔离性,D代表持久性
原子性:是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生
一致性:是指事务前后数据的完整性必须保持一致,即不破坏数据
隔离性:是多个用户并发访问数据库时,事务之间是隔离的,一个事务不应该影响其它事务运行效果
持久性:是指在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
TCL语句:begin/start transaction,commit,rollback,savepoint,rollback to savepoint
存储过程(Storage Procedure)
实现某个功能的代码块,没有返回值的函数
函数(Function)
实现某个功能的代码块,带有返回值的存储过程
游标(Cursor)
一种处理数据的方式,用于查看或处理查询结果集中的数据,可以让我们在查询结果集中以一行或多行为单位向前或向后浏览或处理数据
使用步骤:
1,定义(声明)游标
2,打开游标
3,提取游标
4,关闭游标
触发器(Trigger)
在发生某个事件(比如对某张表进行增删改操作等)时会被自动执行的存储过程
一旦产生一条事件,可以用触发器进行拦截
扩展
begin:生成新事务
rollback;回滚,回到启动事务时的状态
commit;提交
事务一旦提交就会持久性的保存在数据库中,没提交之前通过其他窗口来看是看不到的,这就是持久性和隔离性
只要不提交,对别人的连接没有任何的效果
创建保存点:savepoint s1;保存状态 s1
回滚到s1保存点:rollback to s1
回滚只能向前,不能向后,即创建s1,s2,s3保存点,如果回滚到s2,s2之后的内容就会消失,即s3消失,且之后只能再回滚到s1,并不能再回滚到s3
注意:创建新事物之后,不能使用DDL语句,即创建或取消数据库的语句,此语句会自动执行commit提交,即事务隐性提交
一般能称上编程语言的都必须拥有变量,运算符,函数等
create function get _stu_name(stno int)
returns varchar(20)
begin
declare sname varchar(20);
select name into sname from student where sno=stno;
return sname
end;
select get_stu_name(1002); # 调用函数
create function get _stu_name(in stno int, out sname varchar(20))
begin
select name into sname from student where sno=stno;
end;
call get_stu_name(1004, @sname); # 调用存储过程
求累加和
create function azhe_sum(n int unsigned) returns int unsigned
begin
declare s int unsigned default 0;
while n >= 0 do
set s = s + n;
set n = n - 1;
end while;
return s;
end;
select azhe_sum(100)
select azhe_sum(sno) from student where name="李四";
游标
create procedure cursor_test(out sno int, out name varchar(20), out phone char(11))
begin
declare sno int;
declare name varchar(20);
declare phone char(11);
declare c cursor for select sno, name, phone from student;
open c;
fetch c into sno, name, phone; # 遍历
close c;
end;
call cursor_test(@a, @b, @c);
触发器
create table score(sno int, cno int, score int);
create trigger hack_dj before insert on score
for each row
begin
if new.sno = 1001 or new.sno = 1002 then
if new.score < 60 then
set new.score = 80;
end if;
end if;
end;
insert into score values(1003, 2001, 49)
对变量直接赋值使用set
MySQL服务器就是基于TCP写的
Python其实一般不支持输出型参数
贵人多忘事
你说你想专注一件事,其实
你所谓的专注,只不过你懒惰的借口
作业
1.创建一个存储过程,实现通过学生姓名可以获取该学生的Python程序设计这门课 的分数,如果该学生没有分数,就向分数表中插入一条记录,其中score字段为0;
2.创建一个触发器,实现对某张表中被删除记录的容灾备份;