CREATE DEFINER=`root`@`localhost` PROCEDURE `PrcCopyQuestion_Admin`(in Param1,in Param2 varchar(45))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
Select 'Fail' as 'Status' ;
END;
DECLARE EXIT HANDLER FOR sqlwarning
BEGIN
ROLLBACK;
Select 'Fail' as 'Status' ;
END;
Start transaction;
Insert statement 1;
Insert statement 2;
SELECT 'Success' AS 'Status';
call PrcGetQuestionAndOption_Admin(@variable);
Commit;
END
我正在使用Mysql 5.7
。如果第二个(Insert语句2)失败,则在提交块中。它将进入Rollback部分并输出为'Failed'
。但是当我获得输出时,它仍然在提交块中执行Select 'Success'
作为Status。
所以我的问题是当第二个插入语句失败时。它应该直接进行回滚并将状态视为失败。它不应该在提交块中执行“成功”状态。
例如:在回滚时,我得到两个结果集:
Select 'Fail'..1st result set
Select 'Success'....2nd result set
我只需要输出
Select 'fail'
任何帮助表示赞赏!!
答案 0 :(得分:0)
我无法重现这个问题。
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.12 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP TABLE IF EXISTS `t1`, `t2`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `t1` (
-> `c0` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `t2` (
-> `c0` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> DROP PROCEDURE IF EXISTS `PrcCopyQuestion_Admin`//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE PROCEDURE `PrcCopyQuestion_Admin`(Param1 INT, Param2 VARCHAR(45))
-> BEGIN
-> DECLARE EXIT HANDLER FOR SQLEXCEPTION
-> BEGIN
-> ROLLBACK;
-> SELECT 'Fail' Status;
-> END;
-> DECLARE EXIT HANDLER FOR SQLWARNING
-> BEGIN
-> ROLLBACK;
-> SELECT 'Fail' Status;
-> END;
-> START TRANSACTION;
-> INSERT INTO `t1` (`c0`) VALUES (0);
-> IF Param1 = 0 THEN
-> INSERT INTO `ERR_t2` (`c0`) VALUES (0);
-> ELSE
-> INSERT INTO `t2` (`c0`) VALUES (0);
-> END IF;
-> SELECT 'Success' Status;
-> COMMIT;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `PrcCopyQuestion_Admin`(0, NULL);
+--------+
| Status |
+--------+
| Fail |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t1`;
Empty set (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t2`;
Empty set (0.00 sec)
mysql> CALL `PrcCopyQuestion_Admin`(1, NULL);
+---------+
| Status |
+---------+
| Success |
+---------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t1`;
+----+
| c0 |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t2`;
+----+
| c0 |
+----+
| 1 |
+----+
1 row in set (0.00 sec)