SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.06.2011 22:35:39

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Не срабатывает ROLLBACK по условию

Добрый вечер, у меня возникла следующая проблема. Есть ХП которая в транзакции вызывает другую ХП, в последней в свою очередь находятся условия для завершения транзакции или ее отката. Так вот когда во второй ХП срабатывает условие, например А=В, то почему то транзакция не откатывается, и данные заносятся в базу. Простой пример второй ХП:

proc:BEGIN DECLARE EXIT HANDLER FOR NOT FOUND BEGIN SELECT 1;COMMIT;END # Выход если данных в таблице нет; #Далее идет код выборки из таблиц в переменные; IF(A=B) THEN SELECT 0;ROLLBACK;LEAVE proc; # Откатить транжакцию и вый

Отредактированно simple (13.06.2011 23:41:45)

Неактивен

 

#2 13.06.2011 23:33:01

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Не срабатывает ROLLBACK по условию

Так вот именно в этом условии и не срабатывает ROLLBACK, хотя условие выполняется, SELECT выводит 0. Но данные все равно сбрасываются на диск, причем каких либо ошибок клиент не выдает. Покопавшись немного методом тыка убрал SELECT в обработчики EXIT HANDLER SQL FOR NOT FOUND. И о чудо, транзакция началась откатывать на данном условии, но ведь это бред полный, неужели все дело было в этом SELECTe в обработчики??? Кстати есть еще интересный момент, в ХП1 имеется запрос к метаданным к базе INFORMATION_SCHEMA

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="Моя таблица";
Запрос позволяет узнать следующий auto_increment таблицы. Так вот если добавить в ХП1 обработчик ошибок
DECLARE EXIT HANDLER FOR SQLEXEPTION BEGIN SELECT "Есть ошибка!";ROLLBACK;END;
то он почемуто срабатывает именно на этот запрос. А если убрать этот обработчик то ошибки клиент не выдает.Что это может быть? И собственно по теме вопрос, что из выше перечисленного может повлиять в той или инной мере на откат транзакций? Хотя проблема вроде и решена, но что то мне кажется что это не то, хочу разобраться чтоб в будущем не наступать на эти грабли. Добавлю, транзакцию вызываю START TRANSACTION, таблицы естественно INNODB, в ХП2 где все и происходит имеются условные переходы LEAVE метка и выполнение запросов в цикле WHILE DO. В чем может быть проблема ума не преложу. Если уж транзакции себя так ведут то я не знаю о какой целосности и надежности данных говорить в mysql. Или все таки не стоит от бесплатной базы ждать сверх надежности? Спасибо.

Неактивен

 

#3 17.06.2011 02:32:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не срабатывает ROLLBACK по условию

Если Вы лезете за следующим значением автоинкремента в INFORMATION_SCHEMA —
Вы уже роете могилу своему приложению. Опомнитесь и никогда, никогда (я говорил
«никогда»?) не выбирайте следующее значение. Вставьте строку — а потом уже от
вставленного значения отталкивайтесь.

Что касается обработчиков. Обработчики вызываются тогда, когда происходит собы-
тие. Если Вы создаете обработчик CONTINUE, то управление потом возвращается в
место, где произошло событие. В Вашем случае Вы явно указываете, что возвращаться
не надо — вот управление до ROLLBACK и не доходит. А второй SELECT 1 нужно просто
прочитать wink

Неактивен

 

#4 17.06.2011 16:03:51

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Не срабатывает ROLLBACK по условию

paulus написал:

Если Вы лезете за следующим значением автоинкремента в INFORMATION_SCHEMA —
Вы уже роете могилу своему приложению. Опомнитесь и никогда, никогда (я говорил
«никогда»?) не выбирайте следующее значение. Вставьте строку — а потом уже от
вставленного значения отталкивайтесь.

А чем собственно плохо обращаться к метабазе? Как еще поступить если мне нужно дублировать в ячейку auto_inrement вставленной строки , в процессе вставки ведь ни как до значения auto_incrementa не добраться

Неактивен

 

#5 17.06.2011 17:50:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не срабатывает ROLLBACK по условию

Почему нет? Вставили — и LAST_INSERT_ID() к Вашим услугам.

Неактивен

 

#6 17.06.2011 18:08:18

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: Не срабатывает ROLLBACK по условию

Вы про это говорите? INSERT INTO table SET a=1,b=1,copy_autoincrement=LAST_INSERT_ID();? Не работает к сожалению, только в два запроса получится первый вставка,второй апдейт.

Неактивен

 

#7 17.06.2011 18:22:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Не срабатывает ROLLBACK по условию

Не поверите, автоинкрементное поле заполнится самостоятельно, Вам не нужно
ничего для этого делать smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson