2017-02-23 23 views
0

我有兩個表,如
SAMPLETABLE1(CNT INT(5));
SAMPLETABLE2(CNT INT(5));回滾所有查詢,如果任何查詢返回mysql數據庫中的錯誤

我有一個存儲過程如下:

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; 
// 

當我運行此程序將返回錯誤「數據被截斷列‘CNT’第1行」和第一更新發射是好的,我知道我我將一個字符值插入到一個數字數據類型中。

我想我的第一個查詢是回滾,如果任何查詢返回異常,但它沒有發生請建議。

+0

了退出處理程序只要對的SQLException遇到,導致錯誤的語句之後的語句不執行,並且語句調用在聲明執行後立即在開始和結束聲明之間進行,程序終止。因此,您不需要if k <1代碼塊 - 您可以簡單地用commit語句替換它。 –

回答

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