powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Установка обработчика ошибок ВНЕ процедуры
14 сообщений из 39, страница 2 из 2
Установка обработчика ошибок ВНЕ процедуры
    #39367924
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft, хм. Проверил на своей 5.7.15 - действительно через execute не закоммитил запросы с ошибками, даже выполненные через source. Прерывает выполнение при первой встреченной ошибке и остальные запросы уже не пытается исполнять.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367928
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем издеваться и убираем транзакцию:
Код: powershell
1.
2.
3.
$ mysql -uroot -Dtreect2 -p -e "SET AUTOCOMMIT=1; source bashtransaction.sql;"
Enter password: 
ERROR 1062 (23000) at line 2 in file: 'bashtransaction.sql': Duplicate entry '1' for key 'uq_tree_header'



Проверяем (SELECT * FROM tree;) и да - есть результаты первого инсерта.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367930
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkijmiksoft, хм. Проверил на своей 5.7.15 - действительно через execute не закоммитил запросы с ошибками, даже выполненные через source. Прерывает выполнение при первой встреченной ошибке и остальные запросы уже не пытается исполнять.

не закомитил - выполнил ролбэк??? тоесть результаты первых """успешно""" выполненных проигнорил? я правильно понял ваш тест? (это правильно поведение транзакции поидее)
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367934
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал воспроизвести. Не получилось. Записи, добавляемые в корректных запросах, исправно пополнили таблицу. Server version: 5.7.16-log MySQL Community Server (GPL).
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367945
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПопробовал воспроизвести. Не получилось. Записи, добавляемые в корректных запросах, исправно пополнили таблицу. Server version: 5.7.16-log MySQL Community Server (GPL).

Стоп. Записи в корректных запросах должны пополнять таблицу. И таблица не должна пополняться никакими записями, если хотя-бы одна не верна.

Так что вы проверили только первую часть - поплнение верными данными если все верны. Или я что-то не так понял? Можно поточнее описывать то что вы на вход так сказать даёте? =)
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367946
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovMelkijmiksoft, хм. Проверил на своей 5.7.15 - действительно через execute не закоммитил запросы с ошибками, даже выполненные через source. Прерывает выполнение при первой встреченной ошибке и остальные запросы уже не пытается исполнять.

не закомитил - выполнил ролбэк??? тоесть результаты первых """успешно""" выполненных проигнорил? я правильно понял ваш тест? (это правильно поведение транзакции поидее)
Да, rollback и ничего сохранено не будет. Это как раз нормальное поведение, в отличии от моего примера с ruSO.
Скорей всего клиент не командует rollback сам, а просто отключается. Отключение клиента при открытой транзакции вызывает rollback.

Без транзакции - тоже нормальное поведение, первый результат закоммитился до начала выполнение второго и поэтому не был отменён.

AkinaПопробовал воспроизвести. Не получилось. Записи, добавляемые в корректных запросах, исправно пополнили таблицу
Все запросы в командах были корректны? Или записались только корректные при наличии одного или нескольких некорректных, но те запросы пропустились?
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367953
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный стек кода так сказать (код весь ручками писался, прям каждая кавычечка):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
DROP DATABASE IF EXISTS `treect2`;
CREATE SCHEMA `treect2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `treect2`;

DROP TABLE IF EXISTS `treerel`;
DROP TABLE IF EXISTS `tree`;
CREATE TABLE IF NOT EXISTS `tree` (
  `id` INT unsigned NOT NULL AUTO_INCREMENT,
  `pid` INT unsigned NULL DEFAULT NULL,
  `header` VARCHAR(180) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_tree_header` (`header` ASC)
)
ENGINE InnoDB
AUTO_INCREMENT 1
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;

ALTER TABLE `tree`
  ADD CONSTRAINT `fk_tree_pid` FOREIGN KEY (`pid`) REFERENCES `tree` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT;

CREATE TABLE IF NOT EXISTS `treerel` (
  `aid` INT unsigned NOT NULL,
  `did` INT unsigned NOT NULL,
  -- `level` INT unsigned NOT NULL,
  UNIQUE KEY `uq_treerel_adid` (`aid` ASC, `did` ASC),
  CONSTRAINT `fk_treerel_aid` FOREIGN KEY (`aid`) REFERENCES `tree` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT,
  CONSTRAINT `fk_treerel_did` FOREIGN KEY (`did`) REFERENCES `tree` (`id`) ON UPDATE CASCADE ON DELETE RESTRICT
)
ENGINE InnoDB
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;

DROP TRIGGER IF EXISTS `tai_tree`;
DROP TRIGGER IF EXISTS `tbd_tree`;
DROP TRIGGER IF EXISTS `tbu_tree`;

CREATE TRIGGER `tai_tree` AFTER INSERT ON `tree` FOR EACH ROW
trigger_label:BEGIN
	IF @disable_triggers IS NULL THEN
		-- Если вставляем элемент в корень, то связи не добавляем
		IF NEW.`pid` IS NULL THEN
			LEAVE trigger_label;
		END IF;
		-- Вставляем связи
		INSERT INTO `treerel` (`aid`, `did`)
			-- Выбираем предков указанного родителя (did = idРодителя)
			-- и вставляем записи типа: idПредка, нашId
			SELECT `aid`, NEW.`id`
			FROM `treerel`
		    WHERE `did` = NEW.`pid`
			-- Родитель тоже предок
		    UNION ALL
		    SELECT NEW.`pid`, NEW.`id`;
	END IF;
END;



файлик для теста (bashtransaction.sql):
Код: sql
1.
2.
3.
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '1');
INSERT INTO `tree` (`pid`, `header`) VALUES (1, '1'); -- Тот самый инсерт с ошибкой
INSERT INTO `tree` (`pid`, `header`) VALUES (null, '2');



Запускаем из консоли
Код: powershell
1.
mysql -uroot -Dtreect2 -p -e "START TRANSACTION; source bashtransaction.sql; COMMIT;"
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39367982
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijВсе запросы в командах были корректны? Или записались только корректные при наличии одного или нескольких некорректных, но те запросы пропустились?
Так, поспешил, был неточен.

Запускались .sql приблизительно такого контента:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create table test (
id serial primary key,
val int not null unique
);

insert into test (val)
select 1 union
select 2 ;

start transaction;

insert into test (val) select 3;
insert into test (val) select 2;
insert into test (val) select 4;

commit;

select * from test;

drop table test;


Если запускается из консоли - выполняются все запросы, кроме ошибочного.
Если запускается из командной строки - выполняются все запросы до ошибочного, откат к началу транзакции (при отсутствии неоткатываемых или тех, что до последнего запроса, вызывающего безусловную фиксацию). Где транзакция - в файле или в --execute - неважно.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368074
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zlatov,

какой смысл того что вы хотите?
приведите ворк-флоу, юс-кейс...

кроме бегин-комит-ролбак можно продумать аналогичные
логические ворк-флов, если это вообше возможно.
примерный подход -- писать код который НЕ сломается, а
ексепшн будет отмечен и записан. Затем проходит логическая
проверка результата и делается ручной комит или ролбак.

Ноте-1: не все ошибки можно задавить....
Ноте-2: логические/ручные трансакции хуже чем родные трансакции в плане стабильности
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368284
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcZlatov,

какой смысл того что вы хотите?
приведите ворк-флоу, юс-кейс...

кроме бегин-комит-ролбак можно продумать аналогичные
логические ворк-флов, если это вообше возможно.
примерный подход -- писать код который НЕ сломается, а
ексепшн будет отмечен и записан. Затем проходит логическая
проверка результата и делается ручной комит или ролбак.

Ноте-1: не все ошибки можно задавить....
Ноте-2: логические/ручные трансакции хуже чем родные трансакции в плане стабильности

Изначально я хотел вне всяких процедур декларировать прослушку на ошибки для своевременного отката, поясню:
Есть текстовый файлик с 100500 иструкциями вставки. Было желание просто подать его на вход консольного mysql или в PDO->exec() и причем не заботиться проверкой была ли там ошибка или нет и ручками не писать commit или rollback - Сам файл должен был заботиться и содержать в себе код для отлова ошибок и rollback. Что уже звучит довольно бредово)))) Нет, конечно все возможно, но это неправильный путь изобретения велосипедов.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368389
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZlatovИзначально я хотел вне всяких процедур декларировать прослушку на ошибки для своевременного отката1) Ошибка может быть ТОЛЬКО внутри solid statement (процедуры, функции, триггера или одиночного запроса).
2) Обработчик ошибки имеет скоп solid statement (глобальный - не переопределяется), а потому имеет смысл только внутри скопа соотв. типа. Если он вне скопа, у него отсутствует область видимости.

ZlatovЕсть текстовый файлик с 100500 иструкциями вставки. Было желание просто подать его на вход консольного mysql или в PDO->exec() и причем не заботиться проверкой была ли там ошибка или нет и ручками не писать commit или rollback - Сам файл должен был заботиться и содержать в себе код для отлова ошибок и rollback.
Ну так и рисуйте этот хэндлер внутри "файлика", а сами инструкции оберните в процедуру и добавьте строку её запуска. Или оформите выполнение инструкций файла из статической ХП с соотв. хэндлером. Кстати, можно будет там даже натыкать SAVEPOINT-ов, если файл содержит несколько самостоятельных блоков.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368433
Zlatov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Вот именно _незнание_ вашего первого пояснения послало меня писать "отлов" ошибок вне "solid statement". Сейчас кое что (но далеко не всё) в моей голове стало на свои места.

Спасибо всем.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368708
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaZlatovИзначально я хотел вне всяких процедур декларировать прослушку на ошибки для своевременного отката1) Ошибка может быть ТОЛЬКО внутри solid statement (процедуры, функции, триггера или одиночного запроса).
2) Обработчик ошибки имеет скоп solid statement (глобальный - не переопределяется), а потому имеет смысл только внутри скопа соотв. типа. Если он вне скопа, у него отсутствует область видимости.

ZlatovЕсть текстовый файлик с 100500 иструкциями вставки. Было желание просто подать его на вход консольного mysql или в PDO->exec() и причем не заботиться проверкой была ли там ошибка или нет и ручками не писать commit или rollback - Сам файл должен был заботиться и содержать в себе код для отлова ошибок и rollback.
Ну так и рисуйте этот хэндлер внутри "файлика", а сами инструкции оберните в процедуру и добавьте строку её запуска. Или оформите выполнение инструкций файла из статической ХП с соотв. хэндлером. Кстати, можно будет там даже натыкать SAVEPOINT-ов, если файл содержит несколько самостоятельных блоков.


...ок, боль-мень понятно... можно рассмотреть такой вариант:

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

совмещать большую загрузку и сложную логику -- в общем виде -- некамильфо.
...
Рейтинг: 0 / 0
Установка обработчика ошибок ВНЕ процедуры
    #39368962
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё разумнее - выгружать где-то и потом загружать тут только данные. SELECT INTO OUTFILE и соответственно LOAD DATA INFILE в помощь. А структуру, если она неизвестна, можно передать в форме скрипта. Отдельно от данных.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Установка обработчика ошибок ВНЕ процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]