我有两张 table
样本表1(CNT INT(5));
样本表2(CNT INT(5));
我有一个存储过程如下:
create procedure p1()
begin
declare k int;
DECLARE exit handler for sqlexception
BEGIN
SET k = 0;
ROLLBACK;
END;
set autocommit = off;
START TRANSACTION;
update sampletable2 set cnt = cnt + 5;
insert into sampletable1 values ('5s');
IF k < 1
THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
end;
//
当我运行此过程时,它返回错误“第 1 行的列“cnt”的数据被截断”,并触发第一次更新,这没关系,我知道我正在将字符值插入数字数据类型。
如果任何查询返回异常,我希望我的第一个查询回滚,但它没有发生,请提出建议。
最佳答案
创建表/插入数据
CREATE TABLE sampletable1
(`CNT` INT(5))
;
INSERT INTO sampletable1
(`CNT`)
VALUES
(1)
;
CREATE TABLE sampletable2
(`CNT` INT(5))
;
INSERT INTO sampletable2
(`CNT`)
VALUES
(1)
;
查询
SELECT * FROM sampletable1
结果
CNT
--------
1
存储过程
我在这里使用CONTINUE HANDLER FOR SQLEXCEPTION
DELIMITER $$
CREATE PROCEDURE p1()
BEGIN
DECLARE doRollback BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET doRollback = 1;
SET autocommit = off;
START TRANSACTION;
UPDATE sampletable2 SET CNT = CNT + 5;
INSERT INTO sampletable1 (CNT) VALUES ('5s');
IF doRollback THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END$$
DELIMITER ;
调用 p1()
CALL p1();
结果
1 queries executed, 0 success, 1 errors, 0 warnings
Query: CALL p1()
Error Code: 1265
Data truncated for column 'CNT' at row 1
Execution Time : 0 sec
Transfer Time : 0 sec
Total Time : 0.002 sec
检查示例1表
SELECT * FROM sampletable1
结果
CNT
--------
1
关于mysql - 如果 mysql 数据库中任何查询返回错误,则回滚所有查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42415474/