mysql存儲過程與事務
一、存儲過程
1, 存儲過程 -----類似函數---面向過程
2, 存儲過程的定義,調用,定義變量、賦值變量,判斷條件,通過使用游標、設置continue句柄,更改循環結構為repeat結構
☆分有參無參,其中有參(in 標志輸入變量,out 標記輸出變量,inout 標志既能做輸入也能做輸出變量)
2-1,定義存儲過程procedure
(1)存儲關鍵字:procedure,創建、刪除跟表跟視圖差不多
(2)創建前需要先定義存儲過程結束的符號,關鍵字 delimiter(修改結束符,避免與默認的;矛盾)
(3)create procedure 的標志是以begin 要存儲的過程(查詢的過程吧) end 結束符號
(4)修改結束符號為原來的;(復原結束符)
2-2,調用存儲--使用關鍵字call 存儲過程()
▪無參:call 存儲過程();
▪有參:call存儲過程(@參數1,@參數2…);
select @參數1,@參數2…;
2-3,存儲過程定義變量,以及賦值變量
☆也就是參數變量,局部變量那么回事,記住個關鍵字declare、set標志一下就行啦
其實也沒啥,就是定義變量,賦值變量時,多了個標志的關鍵字declare、set而已。
declare 變量 變量類型;
set 變量=值;
2-4,存儲過程使用判斷條件
if…then 如果怎么怎么,則怎么怎么
elseif … then 否則如果怎么怎么,則怎么怎么
else … 否則怎么怎么
end if;
還有結構:case when…then …end case 都一樣。
2-5,游標:游標游標,就是循環遍歷時使用啦!一般應用於存儲過程內部時,查詢可能返回多條記錄,如果數據量大,則需要使用光標來逐條讀取查詢結果集的記錄,跟java的結果集resultSet,通過next() 操作差不多。
(1)數據量小的情況下,游標的使用情況,直接使用在while結構


(2)數據量大時需要改寫循環結構:改成repeat 結構 until 結束條件 end repeat;
過程中通過定義continue句柄 for not found set 結束條件。

✿注意:游標是只讀的!且只能往前滾動---下一行下一行,所以性能不高,而且使用游標容易造成死鎖,造成內存開發比較大,所以游標一般使用在存儲過程,函數,觸發器中。
例如復制,進行數據庫的維護,例如主從分離,進行數據庫的優化。。。遍歷取出每一行。。。
3, 存儲過程的優缺點:
☼ 優點:
①預編譯,執行速度快,具有更好的性能。存儲過程經過編譯之后會比單獨一條一條執行要快。但這個效率真是沒太大影響。如果是要做大數據量的導入、同步,我們可以用其它手段。
②創建一次可以重復使用,減少開發員的工作量
③減少網絡傳輸,尤其是在高並發情況下,減低網絡的負載。存儲過程主要是在服務器上運行,減少對客戶機的壓力。所有的數據訪問都在服務器內部進行,不需要傳輸數據到其它終端。但我們的用戶服務器通常與數據庫是在同一內網,大數據的訪問的瓶頸會是硬盤的速度,而不是網速(可使用Redis緩存解決)。
④安全性:安全性高,存儲過程可以屏蔽對底層數據庫對象的直接訪問,使用EXECUTE權限調用存儲過程,無需擁有訪問底層數據庫對象的顯式權限。(合理使用)
☼缺點:
① 不可移植性,由於存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性。
② 架構不清晰,不夠面向對象,不是OO的,本質上還是過程化的,面對復雜的業務邏輯,過程化的處理會很吃力。存儲過程不太適合面向對象的設計,無法采用面向對象的方式將業務邏輯進行封裝,業務邏輯在存儲層實現,增加了業務和存儲的耦合,代碼的可讀性也會降低。
③ 不便於調試。基本上沒有較好的調試器,很多時候是用print來調試,但用這種方法調試長達數百行的存儲過程簡直是噩夢。好吧,這一點不算啥,C#/java一樣能寫出噩夢般的代碼。
④ 沒辦法應用緩存。雖然有全局臨時表之類的方法可以做緩存,但同樣加重了數據庫的負擔。如果緩存並發嚴重,經常要加鎖,那效率實在堪憂。
⑤ 無法適應數據庫的切割(水平或垂直切割)。數據庫切割之后,存儲過程並不清楚數據存儲在哪個數據庫中。
4,❀使用建議:普通的項目開發中,不建議大量使用存儲過程,對比SQL語句,存儲過程適用於業務邏輯復雜,比較耗時,同時請求量較少的操作,例如后台大批量查詢、定期更新等。
(1)當一個事務涉及到多個SQL語句時或者涉及到對多個表的操作時可以考慮應用存儲過程
(2)在一個事務的完成需要很復雜的商業邏輯時可以考慮應用存儲過程
(3)比較復雜的統計和匯總可以考慮應用后台存儲過程
二、事務
▷所謂事務:不過是把多條語句一起,通過transaction 結構…一起commit 過去。
▪ 實際應用場景:是把事務放到存儲過程中的。
1,事務是多個操作作為一個整體,要么都執行,要么都不執行。
(默認情況下,每條sql語句視為獨立的一個事務)
而我們為了發揮事務的作用:需要實現多條操作共同執行,共同不執行的結果(設置多條語句為一個事務)
-----自動提交關鍵字: autocommit
▪ 設置事務不再自動提交 set autocommit=0
▪ 事務執行完畢后再設置回事務自動提交 set autocommit=1;
2,❀事務的提出主要是為了解決並發情況下保持數據一致性的問題(類似於多線程)。事務(Transaction)是並發控制的基本單位!

3,✿事務使用注意小細節:如果是表要使用到事務,表的搜索引擎需要設置為InnoDB

4,☼事務:
▷開始事務:start transaction
▷結束事務方式:提交或回滾(根據條件回滾)
•提交事務:commit
•回滾/撤銷事務:rollback
5,事務關閉方式之根據條件回滾:條件有業務邏輯條件,也有sql語法或邏輯錯誤異常【sql異常】
6,事務特(屬)性(ACID)
▪ 原子性:整體的操作里,各部分操作不可分割,要么都執行,要么都不執行。操作成功應用到數據庫,失敗---回滾
▪ 一致性:操作執行前后保持狀態一致,例如銀行轉賬問題:總余額保持不變。
▪ 隔離性:多個用戶並發訪問數據庫時,多個並發事務之間要相互隔離開。例如不同用戶同時向商家支付,用戶之間的各自操作要隔離開來,不受其他用戶操作的影響。
▪ 持久性:成功操作后,就提交到數據庫啦(數據庫的改變是永久的)
