数据库(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.創建一個觸發器,實現對某張表中被刪除記錄的容災備份;
轉載于:https://www.cnblogs.com/yanruizhe/p/11379672.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結