【问题标题】:MySql PHP stored procedures, transactions and rollbacksMySql PHP 存储过程、事务和回滚
【发布时间】:2016-01-18 03:51:00
【问题描述】:

我正在使用存储过程对 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 应该回滚。

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

如何处理?解释清楚的答案将在这里有所帮助。

【问题讨论】:

  • 表格使用的引擎是什么?

标签: mysql stored-procedures transactions


【解决方案1】:

请看下面我的回答。我相信如果您在每次插入后检查@@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
    $$

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多