transakcja mysql - cofanie na dowolnym wyjątku
Czy możliwe jest automatyczne cofnięcie, jeśli wystąpi jakiś błąd na liście poleceń mysql?
Na przykład coś w stylu:
begin transaction;
insert into myTable values1 ...
insert into myTable values2 ...; -- will throw an error
commit;
Teraz, podczas wykonywania chcę, aby cała transakcja nie powiodła się, dlatego powinienem nie widzieć wartości1 w myTable. ale niestety tabela jest przeliczana z wartościami1, mimo że transakcja ma błędy.
Jakieś pomysły, jak to zrobić? (ponownie w przypadku jakiegokolwiek błędu)?Edycja-zmiana z DDL na standard SQL
23
2 answers
Możesz użyć 13.6.7.2. Zadeklarować ... Składnia obsługi w następujący sposób:
DELIMITER $$
CREATE PROCEDURE `sp_fail`()
BEGIN
DECLARE `_rollback` BOOL DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;
START TRANSACTION;
INSERT INTO `tablea` (`date`) VALUES (NOW());
INSERT INTO `tableb` (`date`) VALUES (NOW());
INSERT INTO `tablec` (`date`) VALUES (NOW()); -- FAIL
IF `_rollback` THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END$$
DELIMITER ;
Aby uzyskać pełny przykład, sprawdź następujące polecenie SQL Fiddle .
39
Author: wchiquito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 13:59:51
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 13:59:51
Możesz użyć funkcji EXIT, jeśli na przykład musisz zasygnalizować konkretny wyjątek SQL w kodzie. Na przykład:
DELIMITER $$
CREATE PROCEDURE `sp_fail`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK; -- rollback any changes made in the transaction
RESIGNAL; -- raise again the sql exception to the caller
END;
START TRANSACTION;
insert into myTable values1 ...
IF fail_condition_meet THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Custom error detected.', MYSQL_ERRNO = 2000;
END IF;
insert into myTable values2 ... -- this will not be executed
COMMIT; -- this will not be executed
END$$
DELIMITER ;
12
Author: KGs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-25 20:32:22
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-25 20:32:22