posts - 609,  comments - 13,  views - 64万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
示例
复制代码
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,第一条正常,第二条语句异常,则全部回滚。

posted on   邢帅杰  阅读(348)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球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 用户管理和策略
点击右上角即可分享
微信分享提示