2010-09-29 73 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)