SQL過程代碼:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `test_procedure`()
BEGIN
DECLARE errno int;
declare continue HANDLER for sqlexception
begin
rollback;
set errno=1;
end;
start transaction;
set errno=0;
insert into test(name) values ('kaka');
insert into test(id, name) values(1,'papa');
commit;
select errno;
END
過程說明:
1、首先表中已經存在一條記錄(1,'baby');
2、調用測試存儲過程;
3、該過程首先聲明error變量,和一個SQL異常處理handler,該handler觸發時會回滾事務,並將error置為1;
事務開始,將error置為0,插入一條數據name為‘kaka’,再插入一條數據(1,'papa'),然後提交;
但第二次插入數據時,主鍵id已存在,此處會報異常觸發我們的SQL異常處理handler。實現回滾並將error置為1;
查看error值;
4、調用存儲過程之後查看測試表中的數據是否回滾;
調用前:

調用中:

調用後:

建庫SQL:
CREATE DATABASE IF NOT EXISTS `test`; USE `test`; DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
綜上,可以通過在存儲過程中聲明異常處理handler使得我們的事物達到回滾效果。