powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / В хранимой процедуре транзакция выполняется не полностью.
10 сообщений из 10, страница 1 из 1
В хранимой процедуре транзакция выполняется не полностью.
    #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
В хранимой процедуре транзакция выполняется не полностью.
    #39074423
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seg856,

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


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