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( ); 调用刚刚定义的存储过程