Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В хранимой процедуре транзакция выполняется не полностью. / 10 сообщений из 10, страница 1 из 1
12.10.2015, 07:50:34
    #39074120
seg856
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
Несколько раз сталкивался, что в хранимой процедуре транзакция выполняется не полностью. Например, если в запросе insert ниже комментария "#добавление ролей" сделать ошибку в имени столбца, то будет выдано сообщение об ошибке, в таблицу usr строка будет добавлена, а в adm_Usrroles- нет. Такого же не должно быть. Как этого избежать?

Код: 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.
DELIMITER $$

DROP PROCEDURE IF EXISTS `UsrAdd` $$
CREATE DEFINER=`hospital`@`%` PROCEDURE `UsrAdd`(

login_ varchar(30), pwd_ char(32), fio_ varchar(60), loginon_ tinyint(1), ui_ int(10)

)
bg:BEGIN

declare c int(10);
declare msg varchar(200);
declare s varchar(200);

rollback;
start transaction;

if login_ is null or trim(login_)='' then

	set msg='Пользователь не добавлен. Логин пуст.';
  signal sqlstate '03000' set message_text=msg;
	rollback;
	leave bg;
end if;

insert into usr (login, pwd, fio, loginon, ts, di, ui)
values (trim(login_), pwd_, trim(fio_), coalesce(loginon_,0), 0, sysdate(), ui_);

select last_insert_id() as code;
set c=last_insert_id();

#добавление ролей
insert into adm_usrroles (rf_usrid, rf_adm_roleid, ts, ui, di)
select c, rf_adm_roleid, 0, ui_, sysdate()
from tmpUsrroles
where `add`=1 and del<>1;

commit;

END $$

DELIMITER ;
...
Рейтинг: 0 / 0
12.10.2015, 13:22:23
    #39074423
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
seg856,

Все таблицы на InnoDB ?
...
Рейтинг: 0 / 0
12.10.2015, 14:02:28
    #39074461
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
seg856Как этого избежать?
Не делать безусловный commit.
...
Рейтинг: 0 / 0
12.10.2015, 14:06:19
    #39074467
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
А с чего ты думаешь, что ошибка вызовет откат? Где тот ROLLBACK, который его инициирует?
...
Рейтинг: 0 / 0
14.10.2015, 16:21:35
    #39076701
seg856
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
Akina, а в ms sql server если внутри транзакции ошибка, вся транзакция не выполняется. Там не нужно предусматривать все варианты, где может случиться ошибка и вставлять ROLLBACK
...
Рейтинг: 0 / 0
14.10.2015, 16:21:54
    #39076702
seg856
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
MasterZiv, все
...
Рейтинг: 0 / 0
14.10.2015, 16:22:37
    #39076703
seg856
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
Dimitry Sibiryakov, какие условия должны быть на commit в данном примере?
...
Рейтинг: 0 / 0
14.10.2015, 16:47:35
    #39076731
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
seg856а в ms sql server если внутри транзакции ошибка, вся транзакция не выполняется
И что? каким тут боком MS SQL? мало ли кто как себя в каких случаях ведёт...
...
Рейтинг: 0 / 0
15.10.2015, 08:51:31
    #39077172
seg856
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
но в любом СУБД транзакция должна выполняться или не выполняться целиком, что бы ни случилось.
...
Рейтинг: 0 / 0
15.10.2015, 09:25:40
    #39077208
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В хранимой процедуре транзакция выполняется не полностью.
Она и выполняется целиком. Ну посередине выполнения один запрос не был выполнен по причине там syntax error, unknown field или ещё какой - и что? так ведь это нормальное течение процесса, никто и нигде не сказал, что такая ошибка должна привести к откату транзакции, ибо ROLLBACK-a в упор не видать, а вот COMMIT, наоборот, тутачка... Не согласен? ну тогда тыкни в то место документации, где написано, что ошибка выполнения одного любого оператора приводит к безусловному откату транзакции.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В хранимой процедуре транзакция выполняется не полностью. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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