目錄
📌MySQL存儲過程和函數
??存儲過程和函數介紹
??存儲過程的創建和調用
??存儲過程的查看和刪除
??存儲過程語法-變量
??存儲過程語法-if語句
??存儲過程語法-參數傳遞
??存儲過程語法-while循環
??存儲過程語法-存儲函數
📌MySQL觸發器
??觸發器介紹
??觸發器操作
📌MySQL事務
??事務介紹
??事務的操作
??事務的提交方式
??事務的四大特征(ACID)
??事務的隔離級別
📌隔離級別總結
📌MySQL存儲過程和函數
??存儲過程和函數介紹
存儲過程和函數是事先經過編譯并存儲在數據庫中的一段SQL語句的集合。
- 存儲過程和函數的好處
提高代碼的復用性。
減少數據在數據庫和應用服務器之間的傳輸,提高效率。
減少代碼層面的業務處理。
-
存儲過程和函數的區別
存儲函數必須有返回值。
存儲過程可以沒有返回值。
??存儲過程的創建和調用
- 創建存儲過程
-- 修改結束分隔符
DELIMITER$
-- 創建存儲過程
CREATE PROCEDURE 存儲過程名稱(參數列表)
BEGIN
? ? ? ? ? ? ? ? ? ? ? ? ? SQL語句列表;
END$
-- 修改結束分隔符
DELIMITER;
- 調用存儲過程
CALL 存儲過程名稱(實際參數);
??存儲過程的查看和刪除
- 查看數據庫中所有的存儲過程
SELECT * FROM mysql.proc WHERE db='數據庫名稱';
- 刪除存儲過程
DROP PROCEDURE [IF EXISTS] 存儲過程名稱;
??存儲過程語法-變量
- 定義變量
DECLARE 變量名 數據類型 [DEFAULT默認值];
- 變量賦值方式一
SET 變量名 = 變量值;
- 變量賦值方式二
SELECT 列名 INTO 變量名 FROM 表名 [WHERE 條件];
??存儲過程語法-if語句
if語句標準語法
IF 判斷條件1 THEN 執行的sql語句1;
[ELSEIF 判斷條件2 THEN 執行的sql語句2;]
...
[ELSE 執行的sql語句n;]
END IF;
??存儲過程語法-參數傳遞
- 存儲過程的參數和返回值
CREATE PROCEDURE 存儲過程名稱([IN|OUT|INOUT]參數名 數據類型)
BEGIN
? ? ? ? ? ? ? ? ? ? ? ? SQL語句列表;
END$
IN:代表輸入參數,需要由調用者傳遞實際數據(默認)
OUT:代表輸出參數,該參數可以作為返回值
INOUT:代表既可以作為輸入參數,也可以作為輸出參數
??存儲過程語法-while循環
- while循環語法
初始化語句:
WHILE 條件判斷語句 DO
? ? ? ? ? ? ? ? 循環體語句;
? ? ? ? ? ? ? ? 條件控制語句;
END WHILE;
??存儲過程語法-存儲函數
- 存儲函數和存儲過程是非常相似的,區別在于存儲函數必須有返回值。
- 創建存儲函數
CREATE FUNCTION 函數名稱(參數列表)
RETURNS 返回值類型
BEGIN
? ? ? ? ? ? ? ? ? ? ? ? ?SQL語句列表;
? ? ? ? ? ? ? ? ? ? ? ? ? REUTRN結果;
END$
- 調用存儲函數
SELECT 函數名稱(實際參數);
- 刪除存儲函數
DROP FUNCTION 函數名稱;
📌MySQL觸發器
??觸發器介紹
觸發器是與表有關的數據庫對象,可以在insert、update、delete之前或之后觸發并執行觸發器中定義的SQL語句。這種特殊可以協助應用系統在數據庫端確保數據的完整性、日志記錄、數據校驗等操作。使用別名NEW和OLD來引用觸發器中發生變化的內容記錄。觸發器分類
??觸發器操作
創建觸發器
DELIMITER $
CREATE TRIGGER 觸發器名稱
BEFORE|AFTER INSERT|UPDATE|DELETE
ON表名
FOR EACH ROW
BEGIN
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?觸發器要執行的功能;
END$
DELIMITER;
查看觸發器
SHOW TRIGGERS;
刪除觸發器
DROP TRIGGER 觸發器名稱;
📌MySQL事務
??事務介紹
- 事務:一條或多條SQL語句組成一個執行單元,其特點是這個單元要么同時成功要么同時失敗。
- 單元中的每條SQL語句都相互依賴,形成一個整體。
- 如果某條SQL語句執行失敗或者出現錯誤,那么整個單元就會撤回到事務最初的狀態。
- 如果單元中所有的SQL語句都執行成功,則事務就順利執行。
??事務的操作
- 開啟事務
START TRANSACTION;
- 回滾事務
ROLLBACK;
- 提交事務
COMMIT;
??事務的提交方式
- 事務提交方式的分類
自動提交(mysql默認)
手動提交
- 查看事務提交方式
SELECT @@AUTOCOMMIT;
- 修改事務提交方式
SET @@AUTOCOMMIT=數字;
??事務的四大特征(ACID)
- 原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾。
因此事務的操作如果成功就必須要要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
- 一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態。
也就是說一個事務執行之前和執行之后都必須處于一致性狀態。
- 隔離險(isolcation)
隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務。
不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。
- 持久性(durability)
持久性是指一個事務一但被提交了,那么對數據庫中的數據的改變就是永久性的。
即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
??事務的隔離級別
- 事務的隔離級別
多個客戶端操作時,各個客戶端的事務之間應該是隔離的,相互獨立的,不受影響的。
而如果多個事務操作同一批數據時,就會產生不同的問題,我們需要設置不同的隔離級別來解決這些問題。
- 隔離級別分類
隔離級別 | 名稱 | 會引發的問題 |
---|---|---|
read uncommitted | 讀未提交 | 臟讀、不可重復讀、幻讀 |
read committed | 讀已提交 | 不可重復讀、幻讀 |
repeatable read | 可重復讀 | 幻讀 |
serializable | 串行化 | 無 |
-
引發的問題
問題 | 現象 |
---|---|
臟讀 | 在一個事務處理過程中讀取到了另一個未提交事務中的數據,導致兩次查詢結果不一致 |
不可重復讀 | 在一個事務處理過程中讀取到了另一個事務中修改并已提交的數據,導致兩次查詢結果不一致 |
幻讀 | 查詢某數據不存在,準備插入此記錄,但執行插入時發現此記錄已存在,無法插入。或查詢數據不存在執行刪除操作,卻發現刪除成功 |
- 查詢數據庫隔離級別
SELECT @@TX_ISOLATION;
- 修改數據庫隔離級別
SET GLOBAL TRANSACTIONISOLATION LEVEL 級別字符串;
📌隔離級別總結
序號 | 隔離級別 | 名稱 | 臟讀 | 不可重復讀 | 幻讀 | 數據庫默認隔離級別 |
---|---|---|---|---|---|---|
1 | read uncommitted | 讀未提交 | 是 | ?是 | 是 | |
2 | read committed | 讀已提交 | 否 | 是 | 是 | oracle |
3 | repeatable read | 可重復讀 | 否 | 否 | 是 | mysql |
4 | serializable | 串行化 | 否 | 否 | 否 |
注意:隔離級別從小到大安全性越來越高,但是效率越來越低,所以不建議修改數據庫默認的隔離級別。