zoukankan      html  css  js  c++  java
  • mysql存储过程事务

    之前在写一个存储过程的时候由于不仔细导致数据库锁死,这里反省一下。

    存储过程是这样的:把数据按顺序插入三张表,如果其中任何一处出错,就把前面已经做了的操作进行回滚,存储过程里面是用事务实现的,我是这么写的:

    BEGIN
    DECLARE flag TINYINT DEFAULT '1';
    DECLARE v_ucId TINYINT;
    
    BEGIN 
        SELECT 0 INTO flag; 
    END;
    START TRANSACTION;
    
    INSERT INTO ···
    INSERT INTO ···
    INSERT INTO ···
    
    IF flag=0 THEN 
        ROLLBACK;
    ELSE 
        COMMIT;
    END IF; 
    
    SELECT flag;
    END

    这里运行的时候事务开始了,但是由于没有声明什么时候停止事务,所以事务一直在跑,导致数据库锁死,正确的写法应该是这样:

    BEGIN
    DECLARE flag TINYINT DEFAULT '1';
    DECLARE v_ucId TINYINT;
    
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN 
        SELECT 0 INTO flag; 
    END;
    START TRANSACTION;
    
    INSERT INTO ···
    INSERT INTO ···
    INSERT INTO ···
    
    IF flag=0 THEN 
        ROLLBACK;
    ELSE 
        COMMIT;
    END IF; 
    
    SELECT flag;
    END

    这个不是什么技术问题,纯粹的存储过程的语法,虽然只是少了一句

    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION

    但是导致的后果很严重,所以特别写下来,提醒自己在对数据库进行操作的时候必须特别仔细,因为可能由于自己的一个粗心导致整个数据库挂掉

  • 相关阅读:
    jdbc操作元数据
    jdbc完成增删改查
    jdbc原理
    JDBC快速入门
    DOM_调查问卷效果2
    DOM_radio
    DOM_mail效果
    css基础
    《POSIX多线程程序设计》读书笔记
    《(转载)Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)》
  • 原文地址:https://www.cnblogs.com/quyixuanblog/p/5217388.html
Copyright © 2011-2022 走看看