美文网首页
Mysql:存储过程实现事务

Mysql:存储过程实现事务

作者: Js_Gavin | 来源:发表于2021-05-05 11:18 被阅读0次
    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
    

    相关文章

      网友评论

          本文标题:Mysql:存储过程实现事务

          本文链接:https://www.haomeiwen.com/subject/czukdltx.html