注:如下腳本均是在公司的mysql環境上跑的,版本號是5.6.16-log
其餘版本可根據關鍵字 get diagnostics 自行百度。mysql
drop table if exists simon_task; drop table if exists simon_log; create table simon_task(task varchar(200));-- 業務表 CREATE TABLE simon_log (test001 varchar(2000));-- 日誌表 -- 失敗測試 drop procedure if exists print_exception_msg; create procedure print_exception_msg() begin declare v_commit int default 2; -- 定義事務用,1爲正常,-10爲失敗 declare msg text;-- 記錄錯誤信息 -- 異常的時候msg捕獲報錯信息 declare continue handler for sqlexception begin get diagnostics condition 1 msg = message_text;set v_commit = -10; end ; start transaction;-- 設置事務 -- 業務表相關 insert into simon_task values ('111111111'); insert into staff (sda) values('111111111'); if v_commit = -10 then ROLLBACK; -- 記錄報錯信息到日誌 insert into simon_log values (msg); end if ; end; call print_exception_msg; -- 預期:insert into staff (sda) values('as'); 這句是錯誤的,因此simon_task表和staff表都不該該insert成功,而且simon_log記錄報錯緣由 select * from simon_task ; select * from simon_log ; -- 實際:同預期。 -- 成功測試 drop procedure if exists print_exception_msg2; create procedure print_exception_msg2() begin declare v_commit int default 2; -- 定義事務用,1爲正常,-10爲失敗 declare msg text;-- 記錄錯誤信息 -- 異常的時候msg捕獲報錯信息 declare continue handler for sqlexception begin get diagnostics condition 1 msg = message_text;set v_commit = -10; end ; start transaction;-- 設置事務 -- 業務相關語法 insert into simon_task values ('2222222222'); insert into simon_task values ('3333333333'); if v_commit = -10 then ROLLBACK; insert into simon_log values (msg); end if ; end; call print_exception_msg2; -- 預期:simon_task表新增兩條記錄,simon_log表沒有新增的記錄 select * from simon_task ; select * from simon_log; -- 實際:同預期。