示例
DELIMITER $$ DROP PROCEDURE IF EXISTS sp_test1 $$ CREATE PROCEDURE sp_test1() top:BEGIN -- 错误标记,当sql执行出错的时候,设置标记等于1。 DECLARE _err INT DEFAULT 0; -- 错误标记处理,放到最后再声明,要放到游标后面。 -- 不然会报错:Variable or condition declaration after cursor or handler declaration DECLARE CONTINUE HANDLER FOR SQLEXCEPTION,SQLWARNING,NOT FOUND set _err=1; -- 开始事务 START TRANSACTION; -- 执行任意sql语句,如果执行的sql语句任何一个发生异常(比如主键重复),则_err都会被设置为1。 INSERT INTO stu(id,first_name,birth)SELECT 1,'a',NOW(); -- 判断异常状态,回滚和提交。 IF(_err = 1) THEN ROLLBACK; ELSE COMMIT; END IF; END $$ DELIMITER ;
还有一种是隐式提交,如果有异常发生,自动回滚。使用DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;如果没有这一句,就不会回滚,第一条成功,第二条失败报异常。
DELIMITER $$ DROP PROCEDURE IF EXISTS sp_test1 $$ CREATE PROCEDURE sp_test1() top:BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; START TRANSACTION; UPDATE tba SET Address = '这是1'; UPDATE tbb SET Address = '这是测试数据。这是测试数据。2'; COMMIT; END $$ DELIMITER ;
CALL sp_test1();
Address长度只有5,第一条正常,第二条语句异常,则全部回滚。
分类:
MySql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2020-10-19 .NET Core Policy和Claim
2020-10-19 .NET Core Identity 用户管理和策略