MySql PHP存储过程,事务和回滚

时间:2016-01-18 03:51:00

标签: mysql stored-procedures transactions

我正在使用存储过程在Mysql DB

上执行CRUD操作
DELIMITER $$

CREATE PROCEDURE `transaction_sp` ()

BEGIN

   DECLARE exit handler for sqlexception
   BEGIN
     -- ERROR
     ROLLBACK;
   END;

   DECLARE exit handler for sqlwarning
   BEGIN
    -- WARNING
    ROLLBACK;
   END;

  START TRANSACTION;
    INSERT INTO table_name (id, name, address) values ('1','Test','xpert.com');
    SET @LID = LAST_INSERT_ID();
    INSERT INTO table_name3 (id, job, responsibilities) values 
    (@LID,'Sr. Developer','Coding,mentoring etc');
COMMIT;
END
$$

现在,我希望如果第二个INSERT语句失败,则第二个SQL语句不会执行,第一个Insert将被回滚。

通过上述方法,第一笔交易不会回滚。我需要设置任何标志吗?

如何处理?解释得很好的答案在这里会有所帮助。

1 个答案:

答案 0 :(得分:0)

请参阅下面的答案。我相信如果您在每次插入后检查@@ROWCOUNT@@Error,则可以在没有受影响的行时回滚。对不起,如果我使用的方法是错误的。

DELIMITER $$

    CREATE PROCEDURE `transaction_sp` ()

    BEGIN

       DECLARE @nRowCount1 int,
       @nRowCount2  int

       DECLARE exit handler for sqlexception
       BEGIN
         -- ERROR
         ROLLBACK;
       END;

       DECLARE exit handler for sqlwarning
       BEGIN
        -- WARNING
        ROLLBACK;
       END;

      START TRANSACTION;
        INSERT INTO table_name (id, name, address) values ('1','Test','xpert.com');
        SET @LID = LAST_INSERT_ID();
        SET @nRowCount1 =   @@ROWCOUNT ;
        INSERT INTO table_name3 (id, job, responsibilities) values 
        (@LID,'Sr. Developer','Coding,mentoring etc');
        SET @nRowCount2 =@@ROWCOUNT
        if(@nRowCount1 <=0 and @nRowCount2<=0)
        begin
            ROLLBACK ;
        end
    COMMIT;
    END
    $$