Mysql:存储过程实现事务

2021-05-05  本文已影响0人  Js_Gavin
CREATE DEFINER=`root`@`localhost` PROCEDURE `transaction_savepoint`(IN custId char,IN orderNum INT(10))
label:BEGIN

    -- mysql 异常规范
    -- DECLARE [action] HANDLER FOR [condition_value] [statement];
    -- 如果条件的值与condition_value匹配,则MySQL将执行statement,并根据该操作继续或退出当前的代码块。
    
    -- action:
        -- CONTINUE:继续执行封闭代码块(BEGIN ... END)。
        -- EXIT:处理程序声明封闭代码块的执行终止。
        
    -- condition_value指定一个特定条件或一类激活处理程序的条件。condition_value接受以下值之一:
        -- 一个MySQL错误代码
        -- 标准SQL-STATE值或者它可以是SQL-WARNING,NOT-FOUND或SQL-EXCEPTION条件,这是SQL-STATE值类的简写。NOT-FOUND条件用于游标或SELECT INTO variable_list语句。( -符号不需要)
        -- 与MySQL错误代码或SQLSTATE值相关联的命名条件。
    -- 该语句可以是一个简单的语句或由BEGIN和END关键字包围的复合语句。


        
    DECLARE has_err INT DEFAULT 0;
    DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT('Duplicate entry',custId,'for key PRIMARY');
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_err = 1;
    
    START TRANSACTION;
    
    INSERT INTO `sql_inform`.`customers`(`cust_id`, `cust_name`, `cust_address`, `cust_city`, `cust_state`, `cust_zip`, `cust_country`, `cust_contact`, `cust_email`) VALUES (custId, 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
    
    -- 定义保存点
    SAVEPOINT backpoint0;
    
    DELETE FROM orderitems WHERE order_num  = orderNum;
    
    IF has_err = 1 THEN
        -- 如果发生错误,回退到指定保持点的位置
        ROLLBACK TO backpoint0;
        SELECT 'orderitems ROLLBACK TO backpoint0' err_msg;
        LEAVE label; # 退出存储过程
    END IF;

    -- 错误语句 orders_num
    DELETE FROM orders WHERE orders_num = orderNum;
    
    IF has_err = 1 THEN
        -- 如果发生错误,回退到指定保持点的位置
        ROLLBACK TO backpoint0;
        SELECT 'orders ROLLBACK TO backpoint0' err_msg;
        LEAVE label; # 退出存储过程
    END IF;
    
    COMMIT;
END
上一篇下一篇

猜你喜欢

热点阅读