mysql存儲過程中的事務管理示例及說明
今天研究了下在mysql的存儲過程中使用事務的東西,現在寫了一個小示例,在此記錄一下,便於以後借鑒:
www.2cto.com
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語句執行失敗時,查看數據庫表,會發現事務沒有回滾。
以上兩點是我的一點發現和疑惑,希望在此記錄一下,引以為鑒,當然,如果有朋友幫我解決了這個迷惑,我會萬分感激的。