mysql存儲過程事務和捕獲異常信息

注:如下腳本均是在公司的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;
-- 實際:同預期。
View Code
相關文章
相關標籤/搜索