存储过程能完成各种复杂的任务,减轻dao层的编写任务,也使得dao层更好维护,它非常重要!!!
存储过程涉及一系列的操作,所以我们需要使用事务保证数据完整性。
DELIMITER $$
USE `exercise_sql`$$
DROP PROCEDURE IF EXISTS `testTrancation`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `testTrancation`(IN id_for_del INT,IN id_with_constraint INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION,
SQLWARNING ROLLBACK ;
START TRANSACTION ;
DELETE
FROM
customer
WHERE cust_id = id_for_del;
# 对应的引用表里面没有对应的记录,可以删除
DELETE
FROM
customer
WHERE cust_id = id_with_constraint ;
# cust_id 同样被引用为外键, cust_id =1 对应有记录,不能删除
COMMIT ;
END$$
DELIMITER ;
测试用例:
有如下客户表客户id(1-4)有订单,有外键约束,
id >= 5 没有对应订单,没有外键约束
同时删除 1,6 号客户,操作回滚
CALL testTrancation(1,6);
cust_id cust_name
------- -----------
1 shan
2 dan
3 baobao
4 pangzi
5 danmei
6 liuDan
同时删除 0,6 号客户,操作成功,并提交
CALL testTrancation(0,6);
cust_id cust_name
------- -----------
1 shan
2 dan
3 baobao
4 pangzi
5 danmei
注意:
DELETE
FROM
customer
WHERE cust_id =0
虽然 cust_id = 0 的客户信息不存在但是删除是不会报错或者产生异常的,只是影响行数为0
1 queries executed, 1 success, 0 ERRORS, 0 WARNINGS
查询:DELETE FROM customer WHERE cust_id =0
共 0 行受到影响
执行耗时 : 0 sec
传送时间 : 0 sec
总耗时 : 0.001 sec
总结
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING ROLLBACK;
总体定义了出现异常和警告的情况下进行回滚操作这一处理方式来完成事务控制,还可以根据具体需要定义其他更加具体的预定义处理。
可以通过其他具体的判断做出回滚。