溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql中awesome-stored-procedure發(fā)布的示例分析

發(fā)布時間:2022-01-14 14:51:48 來源:億速云 閱讀:145 作者:小新 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)mysql中awesome-stored-procedure發(fā)布的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

mysql中awesome-stored-procedure發(fā)布的示例分析  

前段時間因為線下分析庫上的存儲過程SP無規(guī)范的泛濫,導(dǎo)致ETL和BI報表經(jīng)常出現(xiàn)各種死鎖阻塞問題。遂決定動手整個簡單的SP編碼規(guī)范,其實主要目的就是記錄SP的運行日志和狀態(tài)。


存儲過程在很多“互聯(lián)網(wǎng)新生代”程序員的觀念里可能已經(jīng)是上古物件了吧?現(xiàn)而今大部分的互聯(lián)網(wǎng)系統(tǒng)實現(xiàn)都不太可能采用存儲過程的實現(xiàn)方式,因為它對數(shù)據(jù)庫造成的負(fù)擔(dān)、難于調(diào)試、移植性差,以及在分布式、高并發(fā)場景下的天然劣勢,都阻礙了它的使用。所以阿里巴巴Java編程規(guī)范里明確規(guī)定“禁止使用存儲過程”也就不足為奇了。


但是很多公司的線下關(guān)系型分析庫上,SP仍舊是相當(dāng)常用的一種技術(shù)手段。SP泛濫后主要容易出現(xiàn)以下幾點病癥:


1. 基于SP創(chuàng)建的Event運行頻率和運行時長設(shè)置的盲目且隨意。這會導(dǎo)致:

  • SP自身本次還沒運行完,下一個自己就啟動了,結(jié)果自己把自己鎖死; 

  • 不同SP之間有依賴順序,一旦前置SP出現(xiàn)超時,后續(xù)的SP執(zhí)行只能是錯誤的或者鎖死的狀態(tài);


2. SP的執(zhí)行過程是黑盒、不可見的。準(zhǔn)確的說就是SP在運行過程中沒有足夠的日志線索,很多時候只知道卡主了,但不知道卡在那里。


3. SP沒有異常處理。SP運行過程中發(fā)生錯誤,若沒有捕獲處理,導(dǎo)致最終運行失敗,那么這個SP在整個依賴鏈路的越前端,恢復(fù)成本將越高昂。

mysql中awesome-stored-procedure發(fā)布的示例分析    

上述三個問題最終都可以靠一張日志表來解決,另外為了實現(xiàn)序號自增,又多建了一張序號表,總共2張表。

mysql中awesome-stored-procedure發(fā)布的示例分析  
mysql中awesome-stored-procedure發(fā)布的示例分析  

SP日志工具的代碼我已經(jīng)上傳到了Github上,方便自己和大家翻閱。又因為本人特別喜歡Github上的Awesome系列,順道碰個瓷,這個代碼庫命名為了


awesome-stored-procedure


https://github.com/NicholasQu/awesome-stored-procedure


目前都是基于MYSQL編寫的,其他數(shù)據(jù)庫的有空再考慮完善一下吧。接下來簡單介紹下這幾個Function /Procedure。

FUNCTION getSeqNo

/**********************************************

 *  使用示例

 **********************************************/

select getSeqNo('mall'), getSeqNo('pay');


功能:根據(jù)序號類別,獲取全局自增序號。

不同類別的交叉運行會導(dǎo)致序號跳空,該函數(shù)不保同一類別內(nèi)序號的連續(xù)性。


PROCEDURE logSp*

/**********************************************

 *  使用示例

 **********************************************/

call logSpStart('sp1','testing sp1',100,@sp_exec_no);

call logSpStartAndCheck('sp1','testing sp1',100,'sp2', date_add(now(), interval -1 minute), now(), @sp_exec_no);

call logSpEnd('sp1','end sp1', @sp_exec_no);

mysql中awesome-stored-procedure發(fā)布的示例分析  


SP啟動和先決條件檢查

用于記錄SP啟動時間和狀態(tài),并檢查可以繼續(xù)運行的條件是否滿足:

1. 自身的運行頻度較高,之前自身是否還未運行完成。該情況調(diào)用logSpStart即可;

2. 依賴其他的SP運行完成,自身方能啟動。該情況需調(diào)用logSpStartAndCheck;


SP調(diào)試信息打印

用于打印Info級別的調(diào)試日志, 調(diào)用logSpInfo;


SP結(jié)束日志打印 logSpEnd

用于表示該SP已運行完成。注意這里只標(biāo)識SP的完成,并不一定成功,整個SP中間過程可能發(fā)生了異常,但是繼續(xù)運行完畢了。


SP異常處理

對異常進行處理。有兩種方式:

1. 若該異常無關(guān)痛癢,可以繼續(xù)后續(xù)邏輯的話,使用logSpErrAndContinue;

2. 若該異常直接可以導(dǎo)致SP終止,調(diào)用logSpErrAndEnd;


標(biāo)準(zhǔn)SP寫法

參照 p_sp_demo.MYSQL.SP.sql

https://github.com/NicholasQu/awesome-stored-procedure/blob/master/recordSpLogs/p_sp_demo.MYSQL.SP.sql 

mysql中awesome-stored-procedure發(fā)布的示例分析    

關(guān)于“mysql中awesome-stored-procedure發(fā)布的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI