问答详情
源自:3-2 秒杀操作-并发优化-2

使用存储过程报错

存储过程代码与老师写的一样,也能执行,但是

执行CALL execute_seckill(1007,13813813822,NOW(),@r_result);后报错

ERROR 1146 (42S02): Table 'seckill.success_kill' doesn't exist

提问者:range17 2018-06-09 16:06

个回答

  • 慕函数1174211
    2018-09-17 20:31:18

    我也碰到这个错误,请问解决了吗?

  • 慕盖茨1612020
    2018-06-17 18:46:46

    先在mysql客户端执行下这段sql,创建存储过程。

    DROP PROCEDURE IF EXISTS execute_seckill;
    
    -- 秒杀执行存储过程
    DELIMITER $$ -- console ";" 转换为 "$$"
    
    -- 定义存储过程
    -- 参数:in 输入参数; out 输出参数
    CREATE PROCEDURE `seckill`.`execute_seckill`(
      IN v_seckill_id BIGINT ,
      IN v_phone BIGINT ,
      IN v_kill_time TIMESTAMP ,
      OUT r_result INT
    )
      BEGIN
        -- insert_count 临时变量定义(需要在事物开始之前定义)
        DECLARE insert_count INT DEFAULT 0 ;
        START TRANSACTION ;
        INSERT IGNORE INTO success_killed(
        seckill_id ,
        user_phone ,
        create_time
        ) VALUES (
          v_seckill_id ,
          v_phone ,
          v_kill_time
        ) ;
        -- row_count():返回上一条修改类型sql(delete,insert,upodate)的影响行数
        -- row_count: 0:未修改数据; >0:表示修改的行数; <0:sql错误/未执行修改sql
        SELECT ROW_COUNT() INTO insert_count ;
        IF (insert_count = 0) THEN
          ROLLBACK ;
          -- 设置满足业务逻辑需要的返回结果 r_result
          SET r_result = - 1 ;
        ELSEIF (insert_count < 0) THEN
          ROLLBACK ;
          SET r_result = - 2 ;
        ELSE
          UPDATE seckill
          SET number = number - 1
          WHERE
            seckill_id = v_seckill_id
            AND end_time > v_kill_time
            AND start_time < v_kill_time
            AND number > 0 ;
          -- 再次使用 row_count()
          SELECT ROW_COUNT() INTO insert_count ;
          IF (insert_count = 0) THEN
            ROLLBACK ;
            SET r_result = 0 ;
          ELSEIF (insert_count < 0) THEN
            ROLLBACK ;
            SET r_result = - 2 ;
          ELSE
            COMMIT ;
            SET r_result = 1 ;
          END IF ;
        END IF ;
      END ;
    $$
    -- 代表存储过程定义结束