mysql - 如果 mysql 数据库中任何查询返回错误,则回滚所有查询

标签 mysql

我有两张 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/

相关文章:

MySQL 不同计数

php - 使用php用户定义函数连接多个数据库

php - 在 MYSQL 和 PHP 中显示值直到第一个空格

mysql - 有没有办法从服务器发送短信?

php - 如何加载两个 mo 文件以进行 gettext 本地化

java - Android 应用程序和外部数据库之间通信的最佳方式

mysql - VB.NET MySQL fatal error 但数据库接受输入

mysql - 导入sql数据库,拒绝我访问我的数据库?

mysql - 为什么 MySQL UDF 返回随机数据?

php - 简单的mysql选择