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使得我們的事物達到回滾效果。