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