MySql 事務+異常處理+異常拋出


-- 測試用表
-- innodb 支持事務
CREATE TABLE `tb_test` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8;

 

-- 測試用儲存過程
-- 通過插入相同的主鍵和插入NULL到非空字段中制造異常
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_test`()
BEGIN
    -- 如果出現執行異常則結束后繼的執行,並執行begin-end中的處理
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN
        -- 回滾事務
        ROLLBACK;
        -- 獲取錯誤信息
        GET DIAGNOSTICS CONDITION 1 @p1=RETURNED_SQLSTATE,@p2= MESSAGE_TEXT;  
        -- 借“模擬”拋出異常
        RESIGNAL SET schema_name = 'mtt_dev',   
        table_name = 'tb_test',   
        message_text = @p2,  
        mysql_errno = @p1;
    END;

    START TRANSACTION;

    INSERT INTO `tb_test`(`name`)VALUES ('name');
    INSERT INTO `tb_test`(`name`)VALUES (NULL);
    INSERT INTO `tb_test`(`id`,`name`)VALUES (1,'name2');
    INSERT INTO `tb_test`(`id`,`name`)VALUES (1,'name3');    
        
    COMMIT;
END$$

DELIMITER ;

 

-- 執行
CALL sp_test();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM