mysql存儲過程與事務


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)

原子性:整體的操作里,各部分操作不可分割,要么都執行,要么都不執行。操作成功應用到數據庫,失敗---回滾

一致性:操作執行前后保持狀態一致,例如銀行轉賬問題:總余額保持不變。

隔離性:多個用戶並發訪問數據庫時,多個並發事務之間要相互隔離開。例如不同用戶同時向商家支付,用戶之間的各自操作要隔離開來,不受其他用戶操作的影響。

持久性:成功操作后,就提交到數據庫啦(數據庫的改變是永久的)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM