Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Транзакции в хранимых процедурах. PostgreSQL  (Прочитано 19141 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mfcer__
Команда клуба

ru
Offline Offline

« : 13-11-2007 02:48 » new

Каким образом можно поместить UPDATE в приведённой ниже хранимой процедуре в транзакцию?

Код: (SQL)
CREATE FUNCTION do_something() RETURNS void AS $$
BEGIN
    UPDATE TABLE SET ... -- и так далее, UPDATE довольно навороченный
END;
$$ LANGUAGE plpgsql;

Не работает следующий вариант:

Код: (SQL)
CREATE FUNCTION do_something() RETURNS void AS $$
BEGIN
BEGIN;
    UPDATE TABLE SET ... -- и так далее
COMMIT;
END;
$$ LANGUAGE plpgsql;

Как использовать транзакцию правильно?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-11-2007 08:46 » 

Я PostgreSQL не знаю. Может конструкция "BEGIN TRAN[SACTION]"?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 13-11-2007 14:18 » 

Утверждаю только на основе Oracle - с PostgreSQL не работал.
В функциях транзакции использовать нельзя, равно как и модифицирующие базу операторы (которые могу создать автоматическую транзакцию). Это очень логично, т.к. ф-ия может вызываться из операторов типа INSERT и UPDATE и в этом случае бардак обеспечен.
По правилам того же Oracle транзакции допустимы в процедурах, а в тригерах разрешены модифицирующие операторы.

Операторы, выполненные в тригере, находятся в той же транзакции, что и оператор, инициировавший вызов тригера. По этому беспокоится не нужно: или все разом откатится, или все разом будет принято.
« Последнее редактирование: 13-11-2007 14:21 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #3 : 14-11-2007 08:23 » 

не буду утверждать, но инструкции типа Update, Insert, Delete - являются транзакционными (не явная транзакция) и запихивать их в отдельную транзакцию не имеет смысла

ЗЫЖ это для MS SQL, но возможно это относится к стандарту ANSI SQL
Записан

I Have Nine Lives You Have One Only
THINK!
Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-11-2007 21:19 » 

Mfcer__, вот здесь вроде доступно рассказано: нельзя, но возможны другие варианты...
http://www.postgresql.org/docs/8.0/interactive/plpgsql-porting.html#PLPGSQL-PORTING-EX4

You cannot issue COMMIT in a PL/pgSQL function. The function is running within some outer transaction and so COMMIT would imply terminating the function's execution. However, in this particular case it is not necessary anyway, because the lock obtained by the LOCK TABLE will be released when we raise an error.
« Последнее редактирование: 16-11-2007 21:20 от Kivals » Записан
programmer
Гость
« Ответ #5 : 02-04-2009 11:54 » 

Каким образом можно поместить UPDATE в приведённой ниже хранимой процедуре в транзакцию?

Код: (SQL)
CREATE FUNCTION do_something() RETURNS void AS $$
BEGIN
    UPDATE TABLE SET ... -- и так далее, UPDATE довольно навороченный
END;
$$ LANGUAGE plpgsql;

Не работает следующий вариант:

Код: (SQL)
CREATE FUNCTION do_something() RETURNS void AS $$
BEGIN
BEGIN;
    UPDATE TABLE SET ... -- и так далее
COMMIT;
END;
$$ LANGUAGE plpgsql;

Как использовать транзакцию правильно?
BEGIN
----------
----------
END;
-ETO sam tranzakchiya; Zdes ne nado ne kakoe druqoe tranzakchiya. Libo vse budet rabotat libo ne vse
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 02-04-2009 19:57 » 

programmer, ты хочешь сказать, что BEGIN инициирует транзакцию, а END завершает? Забавно...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #7 : 03-04-2009 15:17 » 

programmer, специально для тебя:

Код:
BEGIN TRAN
UPDATE savings_account
SET balance = balance - $5000
WHERE account_number = @sav_account
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END
UPDATE checking_account
SET balance = balance + $5000
WHERE account_number = @chk_account
IF @@error != 0
BEGIN
ROLLBACK TRAN
RETURN
END

COMMIT TRAN
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines