处理程序中的 MySQL 回滚

Ste*_*one 6 php mysql sqlexception handler

我有一个存储过程,如果出现任何问题,我想在其中回滚。为了做到这一点,我使用了这样的 EXIT HANDLER:

DECLARE EXIT HANDLER FOR sqlexception 
    begin
        ROLLBACK;
    end;
Run Code Online (Sandbox Code Playgroud)

但是这样,当我调用这个存储过程时,如果有任何错误,存储过程就会成功,我不知道实际问题是什么。我希望客户端 (php) 记录错误以便对其进行故障排除。所以我这样修改:

DECLARE EXIT HANDLER FOR sqlexception 
    begin
        get diagnostics condition 1
              @p1 = MESSAGE_TEXT;
        ROLLBACK;
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @p1;
    end;
Run Code Online (Sandbox Code Playgroud)

所以现在存储过程回滚而不是抛出处理程序拦截的异常。这很酷,但有时 MESSAGE_TEXT 超过 128 个字符,在这种情况下我得到:

错误代码:1648。条件项“MESSAGE_TEXT”的数据太长

当然这个解决方案是不可接受的:

DECLARE EXIT HANDLER FOR sqlexception 
    begin
        get diagnostics condition 1
              @p1 = MESSAGE_TEXT;
        ROLLBACK;
        SET @p1=SUBSTRING(@p1,1,128);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = @p1;
    end;
Run Code Online (Sandbox Code Playgroud)

有什么方法可以拦截任何异常,回滚然后向客户端抛出相同的异常?非常感谢您的帮助

Ste*_*one 5

正如肯尼所建议的,答案是:

DECLARE EXIT HANDLER FOR sqlexception 
    begin
        ROLLBACK;
        RESIGNAL;
    end;
Run Code Online (Sandbox Code Playgroud)