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

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

原文地址:https://www.cnblogs.com/quyixuanblog/p/5217388.html