Ahmed AE Ответов: 2

Как откатить неудачный запрос в mysql ?


Я пытаюсь поймать ошибку, возникшую при вставке 2 записей в 2 разных таблицы. Я хочу откатить уже сохраненные запросы, если второй запрос не удался.

Что я уже пробовал:

Я искал решение , и я решил использовать кодировку if внутри процедуры, чтобы проверить количество ошибок с помощью
@@error_count
, вот мой код:
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 $$


Обратите внимание, что
firstdate
значение не повторяется в таблице 2.
когда я выполняю это, он выполняется успешно и дает мне результат в MySQL workbench следующим образом:
1. -- Эта процедура используется для ввода процедуры отбрасывания команд sql, если существует " процедура`

2. второй результат дал мне второй запрос вставки в таблицу 2, который я пытаюсь выполнить.
все результат был
0 row(s) affected.

Также важно отметить, что вставленные значения в таблицах 2 не повторяются. Так что я не знаю, в чем дело.

2 Ответов

Рейтинг:
1

Ahmed AE

я изменил его, чтобы быть :

    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 ;

и попытался вызвать функцию дважды, в первый раз ее выполнения, 2 записи в 2 разных базах данных были сохранены и зафиксированы ans в следующий раз выполнения, произошла ошибка:
Error Code: 1062. Duplicate entry '21390556321230' for key ....

и я хотел убедиться, что отмена сработало хорошо, но к сожалению отмена не удалось восстановить запись, сохраненную в первой таблице


Рейтинг:
0

Wendelius

Несколько замечаний:
- Вы, кажется, нигде не начинаете транзакцию, если у вас где-то есть заявление о начале транзакции
- Во второй раз, когда вы исследуете @x, он все еще имеет то же значение, что и в предыдущем тесте, так как вы не назначили его снова из @@error_count
- Почему бы не исследовать @@error_count напрямую?
- С точки зрения обработки ошибок, это может быть проще в использовании MySQL :: MySQL 5.7 справочное руководство :: 13.6.7.2 объявить ... Синтаксис обработчика[^]


Ahmed AE

пожалуйста, взгляните на мой код ниже.