1 DELIMITER $$ 2 DROP PROCEDURE IF EXISTS test_sp1 $$ 3 CREATE PROCEDURE test_sp1( ) 4 BEGIN 5 DECLARE t_error INTEGER DEFAULT 0; 6 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 7 8 START TRANSACTION; 9 UPDATE `testdb`.`t_student` SET `stu_name` = '哈哈9' WHERE `id` = 9; 10 UPDATE `testdb`.`t_student` SET `stu_name` = '哈哈10' WHERE `id` = 10; 11 UPDATE `testdb`.`t_student` SET `stu_name` = '哈哈11' WHERE `id` = 11; 12 IF t_error = 1 THEN 13 ROLLBACK; 14 ELSE 15 COMMIT; 16 END IF; 17 SELECT t_error; 18 END$$ 19 CALL test_sp1( );
說明 :
DELIMITER $$ 使用DELIMITER關鍵字來重新定義命令結束符,默認的命令結束符為分號';'(也就是原先是鍵入;之后再回車,命令會執行,現在是鍵入$$之后命令會執行)
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; 創建一個sql異常處理器,只要發生異常就將t_error的值置為1
START TRANSACTION; 開啟事務 (在存儲過程中只能使用start transaction來開啟事務,不能使用begin,因為mysql會自動將begin識別為begin...end)
IF t_error = 1 THEN
ROLLBACK; ELSE COMMIT; END IF; 通過判斷t_error的值來看是否發生過sql異常,從而來決定是提交事務還是來回滾事務
SELECT t_error; 查看t_error的值
CALL test_sp1( ); 調用剛剛定義的存儲過程
