close

其實看參考或官網就可以了,

但因為是英文所以忘了不想再慢慢看一次,

記著會比較方便使用.

 

基本的SP架構如下,

DELIMITER |
 
CREATE PROCEDURE DoAndHandleDeadlock ()
BEGIN
    DECLARE TrashVar INTEGER UNSIGNED;
     
    DECLARE EXIT HANDLER
        FOR SQLSTATE '40001' # (ER_LOCK_DEADLOCK) Retry when deadlock occured

        BEGIN
            ROLLBACK AND NO CHAIN; # or COMMIT AND NO CHAIN; 
             
            SELECT SLEEP(FLOOR(RAND() * 5)) INTO TrashVar;
                     
            CALL DoAndHandleDeadlock ();
        END;
 
    SET autocommit := 0;
    START TRANSACTION;
 
        /*取代成該預存程序所需處裡的邏輯部分*/
        SELECT * FROM Test; # Read lock on all rows
        UPDATE Test SET Id = Id + 10; # Trying to upgrade to write lock

 
    COMMIT;
    SET autocommit := 1;
END|
 
DELIMITER ;

 

額外設定max_sp_recursion_depth = 20; (這是參考文章建議的值

因為重試功能的部分是使用遞迴,如果無限制的重試下去降耗盡系統資源.

鶮設一個上限值.

 

解釋幾個部分,

1. DECLARE EXIT HANDLER FOR SQLSTATE '40001', 當此SP交易被選定為Deadlock 犧牲者時,觸發HANDLER處理程序.

2. commit/rollback AND NO CHAIN,  指當前交易結束後,不馬上另起一個交易, 等同於 completion_type 變數是預設值(NO CHAIN或0),  

                                                            如果是AND CHAIN則代表馬上另起一個同隔離層級的交易. 還可以設定RELAEASE代表交易結束後,立馬中斷當前使用者的session連線.

3. autocommit := 0/1, 設定mariadb是否自動commit,預設是啟用(1),指在update完資料後盡可能快的將此資料永久的commit到硬碟去.

4. max_sp_recursion_depth = 20, 預設為0,

 

參考

Deadlock handling in MySQL stored procedures

arrow
arrow
    文章標籤
    deadlock stored procedure
    全站熱搜

    abcg5 發表在 痞客邦 留言(0) 人氣()