MySQL - 在嵌入式程序的情况下回滚事务

标签 mysql error-handling transactions rollback

如果发生错误(使用 SIGNAL),我会尝试在过程中回滚事务。 我有两个问题:

  1. 如果发生错误,我想停止执行语句 1
  2. 如果过程 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

我已阅读thisthis , 但仍然无法使代码工作

最佳答案

尝试:

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/

相关文章:

mysql - 显示数据库命令在 OS X 的 MAMP 中不显示我的数据库

MySQL 全文搜索 - 仅包含所有单词的结果

php - 卡在一个简单的代码上

sqlite - 我们应该在 SQLite 事务内部还是外部绑定(bind)参数?

php - 事务级别隔离如何影响 MySQL 自动提交模式下的性能?

mysql - 查询MySQL时多少字段过多?

php - mysql无缓冲查询锁定不锁定

javascript - 如何处理 promise 的错误?

php - 模型中的 “reporting”错误

logging - JBoss 6 中的事务日志记录