MySql存储过程,事务和回滚

vul*_*ino 11 mysql stored-procedures commit rollback

我找不到在MySql存储过程中使用事务的最佳方法.ROLLBACK如果有任何失败我想要:

BEGIN

    SET autocommit=0;
    START TRANSACTION;

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

    COMMIT;
END
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Fab*_*ien 10

回答1:您不需要设置autocommit = 0

使用START TRANSACTION时,自动提交将保持禁用状态,直到您使用COMMIT或ROLLBACK结束事务.然后,自动提交模式将恢复为先前的状态.

http://dev.mysql.com/doc/refman/5.6/en/commit.html