【问题标题】:mysql Transaction in the commit block提交块中的 mysql 事务
【发布时间】:2016-10-05 21:28:08
【问题描述】:
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。如果第二个(插入语句 2)失败,则在提交块中。它将进入回滚部分并给我输出'Failed'。但是当我得到输出时,它仍然执行 Select 'Success' as Status in commit 块。 所以我的问题是第二个插入语句何时失败。它应该直接回滚并给我失败的状态。它不应该在提交块中执行状态为“成功”。

例如:回滚时我得到两个结果集:

Select 'Fail'..1st result set

Select 'Success'....2nd result set

我只需要输出

Select 'fail'

任何帮助表示赞赏!

【问题讨论】:

  • 我在这里没有发现任何错误。您能否提供示例数据和真实陈述,以便我们尝试重现它?或者你自己试试sqlfiddle.com
  • 先生!。我只需要在回滚时它应该作为“失败”状态执行。但是我得到了两个结果集。提交块中的一个。“成功”也在第二个结果集中执行。或者在事务(提交块)中我们不必使用select语句???
  • 先生!我明白这一点。正如我所说,我在这里看不到任何错误。例如与此比较:stackoverflow.com/questions/9974325/… 或手册:dev.mysql.com/doc/refman/5.7/en/declare-handler.html 所以请提供真实数据,以便我们查看是否可以重现此问题。
  • 是的,当我在 SP 中调用 SP 时出现异常,即调用 PrcGetQuestionAndOption_Admin(@variable);当我在这个 SP 中遇到错误时,我得到了 SQL 异常。两个插入语句运行良好。另外我只想知道是否有任何 sql 异常,例如事务提交块中的 RECORD NOT FIND,就像我们处理光标的方式一样。如果我们在事务提交块中没有找到任何记录。它应该像 sql 异常和 sql 警告一样抛出异常

标签: mysql


【解决方案1】:

我无法重现该问题。

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)

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 2014-07-19
    • 2023-03-27
    • 1970-01-01
    • 2012-12-24
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多