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語句執行失敗時,查看資料庫表,會發現事務沒有復原。