如果发生错误(使用 SIGNAL),我会尝试在过程中回滚事务。 我有两个问题:
- 如果发生错误,我想停止执行语句 1
- 如果过程 1 发生错误,我想停止执行状态 2。
程序一:
CREATE DEFINER=`edgar`@`%` PROCEDURE some_sp (IN param INT)
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE new_legal_entity_id INT;
DECLARE specialty CONDITION FOR SQLSTATE '45000';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _rollback = 1;
START TRANSACTION;
CASE -- Some condition
BEGIN
SIGNAL specialty
SET MESSAGE_TEXT = 'Error message';
END;
ELSE BEGIN END;
END CASE;
INSERT INTO .... -- Statement 1
COMMIT;
END
程序二:
CREATE DEFINER=`edgar`@`%` PROCEDURE some_sp_1 (IN param INT)
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE new_legal_entity_id INT;
DECLARE specialty CONDITION FOR SQLSTATE '45000';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET _rollback = 1;
START TRANSACTION;
CALL some_sp(some_param);
INSERT INTO .... -- Statement 2
COMMIT;
END
最佳答案
尝试:
DELIMITER $$
DROP TABLE IF EXISTS `t`$$
DROP PROCEDURE IF EXISTS `some_sp_1`$$
DROP PROCEDURE IF EXISTS `some_sp`$$
CREATE TABLE `t`(
`id` INT UNSIGNED
)$$
CREATE PROCEDURE `some_sp`(IN `param` INT)
BEGIN
DECLARE `specialty` CONDITION FOR SQLSTATE '45000';
IF `param` THEN
SIGNAL `specialty`;
END IF;
INSERT INTO `t` SELECT 1;
END$$
CREATE PROCEDURE `some_sp_1`(IN `param` INT)
BEGIN
DECLARE `_rollback` BOOL DEFAULT FALSE;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` := TRUE;
START TRANSACTION;
CALL `some_sp`(`param`);
IF `_rollback` THEN
ROLLBACK;
ELSE
-- INSERT INTO `t1` SELECT 2; -- fail, t1 not exist
INSERT INTO `t` SELECT 2;
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END IF;
END$$
DELIMITER ;
CALL `some_sp_1`(0);
-- CALL `some_sp_1`(1);
SELECT `id` FROM `t`;
关于MySQL - 在嵌入式程序的情况下回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34110739/