事務與存儲過程
事務管理
事務的概念
謂的事務就是針對數據庫的一組操作,它可以由一條或多條SQL語句組成,同一個事務的操作具備同步的特點,即事務中的語句要么都執行,要么都不執行。
事務的使用
開啟事務START TRANSACTION;
執行SQL語句
提交事務COMMIT;
取消事務(回滾)
事務的提交
事務中的操作語句都需要使用COMMIT語句手動提交,只有事務提交后其中的操作才會生效。
事務的回滾
如果不想提交當前事務,可使用ROLLBACK語句取消當前事務。
ROLLBACK語句只能針對未提交的事務執行回滾操作,已提交的事務是不能回滾的。
事務的隔離級別
REPEATABLE READ(可重復讀)
READ UNCOMMITTED(讀未提交)
READ COMMITTED(讀提交)
SERIALIZABLE(可串行化)
事務的定義特性
原子性
原子性是指一個事務必須被視為一個不可分割的最小工作單元,只有事務中所有的數據庫操作都執行成功,才算整個事務執行成功
一致性
一致性是指事務將數據庫從一種狀態轉變為下一種一致的狀態。
隔離性
隔離性還可以稱為並發控制、可串行化、鎖等,當多個用戶並發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個並發事務之間要相互隔離。
持久性
事務一旦提交,其所做的修改就會永久保存到數據庫中,即使數據庫發生故障也不應該對其有任何影響。
事務的持久性不能做到100%的持久,只能從事務本身的角度來保證永久性,而一些外部原因導致數據庫發生故障,如硬盤損壞,那么所有提交的數據可能都會丟失。
存儲過程的創建
什么是存儲過程
存儲過程就是一條或多條SQL語句的集合,當對數據庫進行一系列復雜操作時,存儲過程可以將這些復雜操作封裝成一個代碼塊,以便重復使用,大大減少數據庫開發人員的工作量。
創建存儲過程
CREATE PROCEDURE sp_name([proc_parameter])
[characteristics…]routine_body
CREATE PROCEDURE:為用來創建存儲過程的關鍵字。
sp_name:為存儲過程的名稱。
proc_parameter:為指定存儲過程的參數列表。
characteristics:用於指定存儲過程的特性。
變量的使用
定義
在MySQL中,變量可以在子程序中聲明,用於保存數據處理過程中的值,這些變量的作用范圍在BEGIN…END程序中。
DECLARE var_name[,varname]…date_type[DEFAULT value];
var_name:為局部變量的名稱。
DEFAULT value:子句給變量提供一個默認值,該值可以被聲明為一個常數或一個表達式。如果沒有DEFAULT子句,變量的初始值為NULL。
使用SET語句為變量賦值
SET var_name =
expr[,var_name = expr]…;
使用SELECT…INTO為一個或多個變量賦值
SELECT col_name[…]
INTO var_name[…] table_expr;
定義條件和處理程序
定義條件是指事先定義程序執行過程中遇到的問題
DECLARE condition_name CONDITION FOR [condition_type];
// condition_type的兩種形式:
[condition_type]:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code
處理程序定義了在程序執行過程中遇到問題時應當采取的處理方式,並且保證存儲過程在遇到警告或錯誤時能繼續執行處理過程使用DECLARE語句定義
DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
|condition_name
|SQLWARNING
|NOT FOUND
|SQLEXCEPTION
|mysql_error_code
handler_type:為錯誤處理方式,參數取值
有3個:CONTINUE、EXIT和UNDO。
CONTINUE:表示遇到錯誤不處理,繼續執行;
EXIT:遇到錯誤馬上退出。
UNDO:表示遇到錯誤后撤回之前的操作,MySQL中暫時不支持這樣的操作。sp_statement:參數為程序語句段,表示在遇到定義的錯誤時,需要執行的存儲過程。
condition_value:表示錯誤類型。
光標的使用
在編寫存儲過程時,查詢語句可能會返回多條記錄,如果數據量非常大,則需要使用光標來逐條讀取查詢結果集中的記錄。光標是一種用於輕松處理多行數據的機制。
聲明
語法:DECLARE cursor_name CURSOR FOR select_statement
示例:DECLARE cursor_student CURSOR FOR select s_name,s_gender FROM student;
使用
語法:OPEN cursor_name FETCH cursor_name INTO var_name[,var_name]…
示例:FETCH cursor_student INTO s_name, s_gender;
關閉
CLOSE cursor_name
流程控制的使用
存儲過程中的流程控制語句用於將多個SQL語句划分或組合成符合業務邏輯的代碼塊,MySQL中的流程控制語句有7個
1、 IF語句
語法格式如下:
IF expr_condition THEN statement_list
[ELSEIF expr_condition THEN statement_list]
[ELSE statement_list]
END IF
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_label:]LOOP
statement_list
END LOOP [loop_label]
4、LEAVE語句
語法格式如下:
LEAVE lable
5、ITERATE語句
語法格式如下:
ITERATE lable
6、REPEAT語句
語法格式如下:
[repeat_lable:] REPEAT
statement_list
UNTIL expr_condition
END REPEAT[repeat_lable]
7、WHILE語句
語法格式如下:
[[while_lable:] WHILE expr_condition DO
Statement_list
END WHILE [while_lable]
存儲過程的使用
調用存儲過程
CALL sp_name([parameter[,…]])
CALL:為調用存儲過程的關鍵字。
sp_name:為存儲過程的名稱。
Parameter:為存儲過程的參數。
查看存儲過程
1、使用SHOW STATUS語句
CALL sp_name([parameter[,…]])
2、使用SHOW CREATE語句
SHOW CREATE{PROCEDURE|FUNCTION} sp_name
3、information_schema.Routines表中查看
SELECT * FROM information_schema.Routines
WHERE ROUTINE_NAME='CountProc1'
AND ROUTINE_TYPE='PROCEDURE'\G
修改存儲過程
ALTER {PROCEDURE|FUNCTION} sp_name[characteristic…]
sp_name:表示存儲過程或函數的名稱。characteristic:表示要修改存儲過程的哪個部分, characteristic 的取值分為8部分。
刪除存儲過程
DROP{ PROCEDURE|FUNCTION }[IF EXISTS] sp_name
綜合案例--存儲過程應用