MySQL預存程序中的交易管理執行個體說明

來源:互聯網
上載者:User

mysql預存程序中事務SQL代碼 

delimiter $$ 
use test$$ 
create procedure t_insert_table() 
begin 
    /** 標記是否出錯 */ 
    declare t_error int default 0; 
    /** 如果出現sql異常,則將t_error設定為1後繼續執行後面的操作 */ 
    declare continue handler for sqlexception set t_error=1; -- 出錯處理 
    /** 顯式的開啟事務,它開啟後,事務會暫時停止自動認可*/ 
    -- start transaction; 
    /** 關閉事務的自動認可 */ 
    set autocommit = 0; 
    insert into t_bom_test(parent_id,child_id) values('D','abc'); 
    insert into t_trigger_test(name,age) values('zhangsan',null); 
    /** 標記被改變,表示事務應該復原 */ 
    if t_error=1 then 
        rollback; -- 交易回復 
    else 
        commit; -- 事務提交 
    end if; 
    -- rollback; 
    -- commit; 
end$$ 
delimiter ; 

寫完這個後,又發現書本上有很多地方都是直接在開始set autocommit = 0;在最後commit或rollback就完成了,我自己實驗了一下,結果出現如下問題:
1)當直接在開始set autocommit = 0;在最後commit或rollback後會出現一下錯誤:
Error Code: 1048. Column 'age' cannot be null ,然後查看了一下資料庫表,發現第一條insert語句執行成功並成功commit了,而第二條則沒有;

2)當SQL代碼 
/** 標記是否出錯 */ 
declare t_error int default 0; 
/** 如果出現sql異常,則將t_error設定為1後繼續執行後面的操作 */ 
declare continue handler for sqlexception set t_error=1; -- 出錯處理 

這兩句代碼存在,而結束時不做if-else判斷,直接執行rollback語句時,發現即使兩條insert語句都執行成功了,但到最後仍然會被復原掉;當直接執行commit語句時,發現如果第一條insert語句執行成功,第二條insert語句執行失敗時,查看資料庫表,會發現事務沒有復原。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.