2010-09-29 105 views
11

我找不到在MySql存儲過程中使用事務的最佳方式。我想ROLLBACK如果有什麼失敗:MySql存儲過程,事務和回滾

BEGIN 

    SET autocommit=0; 
    START TRANSACTION; 

    DELETE FROM customers; 
    INSERT INTO customers VALUES(100); 
    INSERT INTO customers VALUES('wrong type'); 

    COMMIT; 
END 

1)要求autocommit=0

2)如果第二個INSERT中斷(當然它),第一個INSERT不回滾。程序簡單地繼續到COMMIT。我怎樣才能防止這一點?

3)我發現我可以DECLARE HANDLER,我應該使用這個指令還是有一種更簡單的方式來說,如果有任何命令失敗,存儲過程應該是ROLLBACK並且失敗呢?

DECLARE HANDLER工作正常,但由於我有MySql版本5.1我不能使用RESIGNAL。因此,如果發生錯誤,調用者將不會收到通知:

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
BEGIN 
    ROLLBACK; 
    -- RESIGNAL; not in my version :(
END; 

START TRANSACTION; 

回答

0

不同的方法來回答2:你可以使用一個布爾變量來知道你是否應該COMMIT或ROLLBACK。例如:

BEGIN 

DECLARE `should_rollback` BOOL DEFAULT FALSE; 
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `should_rollback` = TRUE; 

START TRANSACTION; 

DELETE FROM customers; 
INSERT INTO customers VALUES(100); 
INSERT INTO customers VALUES('wrong type'); 

IF `should_rollback` THEN 
    ROLLBACK; 
ELSE 
    COMMIT; 
END IF; 
END 

或者,你可以用你非常有用3)