Click here to Skip to main content
15,891,777 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am trying to catch the error occurred while inserting 2 records in 2 different tables. I want to rollback the already stored queries if the second query failed.

What I have tried:

I have searched for the solution , and i decided to use an if codition inside a procedure to check the number of errors using
@@error_count
, here is my code:
DELIMITER $$

-- This procedure is used to enter the sql commands 

DROP PROCEDURE IF EXISTS `procedure` $$
CREATE PROCEDURE `procedure`()
BEGIN
INSERT INTO `mschema`.`table1`
(`maxbudget`,
`blocked`,
`d_percentage`,
`max discount`)
VALUES
('2250',
'0',
'.9',
'.99');
set @x = @@error_count;
if @x= 0 then	 
	INSERT INTO `mschema`.`table2`
	 (`name`,`image`,`date`,`fKey_id`)
	 values
         ('jhon','jfdd', '2018-01-01 00:00:00', LAST_INSERT_ID());
      if @x= 0 then 
	commit;
      else 
	rollback;
      end if;
else rollback;
end if;

END $$


Note that
firstdate
value is not repetitive in table 2.
when i execute this, it executed successfully and gives me the result in MySQL workbench as follow:
1. -- This procedure is used to enter the sql commands DROP PROCEDURE IF EXISTS `procedure`

2. The second result gave me the second insertion query into table 2 i am trying to execute.
all reult has
0 row(s) affected.

It is also important to say that the inserted values in the 2 tables are not repeated. So i do not know what is wrong.
Posted
Updated 19-Apr-18 13:38pm
v3

Few observations:
- You don't seem to start the transaction anywhere, should you have a START TRANSACTION statement somewhere
- The second time you investigate the @x, it still has the same value as in the previous test since you haven't assigned it again from @@error_count
- Why not investigate the @@error_count directly?
- From the error handling point of view, it might be easier to use MySQL :: MySQL 5.7 Reference Manual :: 13.6.7.2 DECLARE ... HANDLER Syntax[^]
 
Share this answer
 
Comments
Ahmed AE 20-Apr-18 11:21am    
please have a look at my code below.
i have modified it to be :
    DROP PROCEDURE IF EXISTS mprocedure;
DELIMITER $$
CREATE PROCEDURE mprocedure ()
BEGIN
START TRANSACTION;
INSERT INTO `mschema`.`table1`
(`maxbudget`,
`blocked`,
`d_percentage`,
`max discount`)
VALUES
('2250',
'0',
'.9',
'.99');
if  (@@error_count = 0 ) then    
    INSERT INTO `mschema`.`table2`
     (`name`,`image`,`date`,`fKey_id`)
     values
         ('jhon','jfdd', '2018-01-01 00:00:00', LAST_INSERT_ID());
      if (@@error_count = 0 ) then 
          commit;
      else 
          rollback;
      end if;
else rollback;
end if;
commit;
END;
$$
DELIMITER ;

and tried to call the function twice, in the first time of its execution, the 2 records in the 2 different database was saved and committed ans in the next time of execution, an error occurred:
Error Code: 1062. Duplicate entry '21390556321230' for key ....

and i wanted to make sure that rollback has worked well, but unfortunately rollback did not revert the record saved in the first table
 
Share this answer
 
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900