gpt4 book ai didi

MySQL 在事务中捕获异常

转载 作者:行者123 更新时间:2023-11-29 02:48:46 28 4
gpt4 key购买 nike

在 mysql 存储过程中返回事务内错误原因的最佳方法是什么?

这是我创建的一个存储过程。但我注意到,如果我在语法上犯了一个错误,例如我忘记将 WHERE 子句放在 update 语句之一中,它只会返回 SELECT 'error' 但不是错误发生的实际原因。

有没有更好的方法来捕获错误,就像在 Java 中,你刚才放的地方一样

catch(SQLException e){
JOptionPane.showMessageDialog(null,e.getError()+"\n"+e.getMessage() );
}

如果有任何示例或最佳实践,我将不胜感激。

CREATE DEFINER=`root`@`localhost` PROCEDURE `updateCurriculumDetails`(p_curriculumId INT, p_editedByUserId INT, p_curriculumName varchar(50), p_description VARCHAR(200), p_gradeLevelId INT, p_schoolYearId INT)
BEGIN

DECLARE hasError BOOLEAN DEFAULT 0;
DECLARE CONTINUE HANDLER FOR sqlexception SET hasError = 1;


START TRANSACTION;

UPDATE curriculum_dt c
SET c.`name` = p_curriculumName,
c.description = p_description,
c.gradeLevelId = p_gradeLevelId
WHERE c.id = p_curriculumId;

UPDATE curriculum_schoolyears_dt cs
SET cs.schoolYearId = p_schoolYearId
WHERE cs.curriculumId = p_curriculumId;

UPDATE curriculum_hd SET editedBy_UserId = p_editedByUserId,
dateLastEdited = NOW()
WHERE curriculumId = p_curriculumId;


IF hasError THEN
ROLLBACK;
SELECT 'error';
ELSE
COMMIT;
SELECT 'successfully updated' AS result;

END IF;

END

提前致谢。

最佳答案

CONTINUE HANDLER 在这里的使用是完全不合适的。您允许其余查询在发生错误后运行,这充其量是浪费时间和资源,因为您正在执行您已经知道将回滚的查询。相反,这样的事情似乎是一个更好的计划:

DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;

但是,最佳实践是不允许过程控制事务。如果调用 session 已经持有一个事务,START TRANSACTION; 在过程中将默默地和隐含地提交它,使调用者处于无法回滚和不知道条件的不利位置。

关于MySQL 在事务中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38518520/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com