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

时间:2017-02-23 12:13:41

标签: mysql

我有两张表,如
SAMPLETABLE1(CNT INT(5));
SAMPLETABLE2(CNT INT(5));

我有一个存储过程如下:

if let antiAliasing = dict["antAliasing"] as? [NSValue] {
    UIBezierPath.interpolateCGPoints(withHermite: antiAliasing, closed: true)
}

当我运行此过程时,它返回错误“第1行的列'cnt'数据被截断”并且第一次更新被触发,这是可以的,我知道我将字符值插入到数字数据类型中。

我希望我的第一个查询回滚,如果任何查询返回异常,但它没有发生请建议。

1 个答案:

答案 0 :(得分:0)

创建表/插入数据

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

检查sample1表

SELECT * FROM sampletable1

<强>结果

   CNT  
--------
       1