powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функции и транзакции - ?
16 сообщений из 16, страница 1 из 1
функции и транзакции - ?
    #33873557
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в процедурах на T-SQL я делаю отдельную транзакцию и знаю, что большинство процедур выпорлняют некое законченное действие вне зависимости от того, откуда были вызваны.

Какие рекомендации в PG?

Могу ли я открывать и заканчивать транзакцию в процедуре?
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33873637
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhв процедурах на T-SQL я делаю отдельную транзакцию и знаю, что большинство процедур выпорлняют некое законченное действие вне зависимости от того, откуда были вызваны.

Какие рекомендации в PG?

Могу ли я открывать и заканчивать транзакцию в процедуре?В пг нет абстракции "вложенная транзакция", но она в некотором смысле адекватна использованию абстракции "точка сохранения" (на которые может откатываться текущая транзакция). Последняя есть в пг начиная с 8-ки.
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33873656
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 Winnipuhв процедурах на T-SQL я делаю отдельную транзакцию и знаю, что большинство процедур выпорлняют некое законченное действие вне зависимости от того, откуда были вызваны.

Какие рекомендации в PG?

Могу ли я открывать и заканчивать транзакцию в процедуре?В пг нет абстракции "вложенная транзакция", но она в некотором смысле адекватна использованию абстракции "точка сохранения" (на которые может откатываться текущая транзакция). Последняя есть в пг начиная с 8-ки.

да мне и не нужны вложенные в данном случае.
Вопрос - могу ли я открыть Тр в функции, и там же ее коммит или роллбэк?

Т.е является ли это "хорошим тоном" в PG?
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33873812
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет не можешь..
Транзакциями можно управлять явно с наружи путем отсылки соответсвующих комманд begin и commit/rollaback.

Или же работать в режиме автокомиит- т.е. когда ты явно не стартуешь транзакцию каждый оператор (insert,update or select from procedure..) стартует свою транзакцию. и после выполнения завершает ее автоматически.

Внутри процедур ты стартовать транзакцию не можешь - т.к. в связи с с тем, что я написал выше - ты уже находишся внутри транзакции.
Внутри процедур можно ставить savepoint - и в случае чего возвращаться к этому состоянию ( rollback to savepoint)
Но commit - нужно делать снаружи процедур.( или он сделается сразу по окончании статемента если ты не стартовал транзакцию явно)..
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33873869
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh да мне и не нужны вложенные в данном случае.
Вопрос - могу ли я открыть Тр в функции, и там же ее коммит или роллбэк?

Т.е является ли это "хорошим тоном" в PG?вы не поняли. Любая процедура выполняется в транзакции. В той, из которой вызвана. Т.ч. никакой внутренней транзакции невозможно. Транзакцию можно вызвать явно, и тогда все,что выполняется внутри до коммита или роллбака выполняется внутри нее. "Нарезание этой глобальной транзакции на кусочки, которые можно отменять по частям" - это и есть то, для чего объявляются "внутренние транзакции" ("вложенные", а не "автономные") или "сейвпойнты" - кажд. - в своей модели абстракций.
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33873914
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 Winnipuh да мне и не нужны вложенные в данном случае.
Вопрос - могу ли я открыть Тр в функции, и там же ее коммит или роллбэк?

Т.е является ли это "хорошим тоном" в PG?вы не поняли. Любая процедура выполняется в транзакции. В той, из которой вызвана. Т.ч. никакой внутренней транзакции невозможно. Транзакцию можно вызвать явно, и тогда все,что выполняется внутри до коммита или роллбака выполняется внутри нее. "Нарезание этой глобальной транзакции на кусочки, которые можно отменять по частям" - это и есть то, для чего объявляются "внутренние транзакции" ("вложенные", а не "автономные") или "сейвпойнты" - кажд. - в своей модели абстракций.

я понял, просто небольшой разнобой в терминологии.
пример, как у меня сейчас в приложении (через OLEDB) для mssqlserver.

Приложение хочет скопировать некий объект в базе, делается вызов процедуры, в ней begin tran ... копирование ... commit / rollback.
Т.е. внутри приложения я не использую открытие транзакции, закрытие.

Я адаптирую приложение для работы с ПГ. Теперь мне надо будет в приложении делать явно открытие транзакции, вызов функции копирования объекта, и явное закрытие.

Так получается?...
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33873975
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если оформить всю вашу логику в виде единой процедуры и
из приложения явно не стартовать транзакцию ( begin )
то если процедура не выдала ошибки по завершении ее работы автоматом призойдет commit. Вместо ролбака - генерируй исключение - и еслиисключение не отлавливать внутри процедуры - то автомвтом все откатится..
Явно транзакции стартуй только если тебе надо сделать два или больше статемента последовательно. Иначе работай в автокоммит.
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33874001
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
domanixЕсли оформить всю вашу логику в виде единой процедуры и
из приложения явно не стартовать транзакцию ( begin )
то если процедура не выдала ошибки по завершении ее работы автоматом призойдет commit. Вместо ролбака - генерируй исключение - и еслиисключение не отлавливать внутри процедуры - то автомвтом все откатится..
Явно транзакции стартуй только если тебе надо сделать два или больше статемента последовательно. Иначе работай в автокоммит.

о, уже полегче. Т.е. если у меня в batch только вызов одной функции, то практически она и будет выполняться в собственной транзакции?
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33874359
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh Т.е. если у меня в batch только вызов одной функции, то практически она и будет выполняться в собственной транзакции?в транзакции селекта или иного стейтмента, если не заявлена явно (или отменой автокоммит моды) транзакция на больший batch.
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33874361
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 в транзакции селекта или иного стейтментаиз которого вызвана. Т.к. иного вызова, как вызов в стейтменте не предусмотрен.
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33875917
AKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос!!!!

Нужно в одной транзакции выполнить 2 малозависимые процедуры

шлем с клиента
BEGIN TRANSACTION ;

шлем с клиента
SELECT * MyProcedure1 ()
шлем с клиента
SELECT * MyProcedure2 ()
шлем с клиента
COMMIT;

Верно ли в такой подаче, что = если не выполнится корректно MyProcedure2 то транзакция сама откатится???

Мне кажется что нужно как-то отлавливать неверное выполнение процедур, дабы корректно завершить внешнюю транзакцию,
может подскажете на примере как это делать?
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33876545
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да если в MyProcedure2 произошла ошибка - и эта ошибка внутри процедуры не перехватывается- то транзакция автоматом откатится на момент старта begin.

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

Eсли же это по какимто причинам не приемлимо - то тогда внутри процедур ставь отлов ошибок и сам разруливай что в этом случае делать..

напоминаю как в pgplsql отлаваливать ошибки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements
    [ WHEN condition [ OR condition ... ] THEN
          handler_statements
      ... ]
END;
Более подробно смотри документацию в частности раздел
36.7.5. Trapping Errors
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33877350
AKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо! буду копать...

На самом деле нужно чтобы либо обе либо ниодна...

есть просто опасение такое - 1-я выполнилась (коннект через ОДБС)
коннект пропал = 2-я не выполнилась.. и получится недоделка
так как эти процедуры пишут в разные таблицы, + 2-я пишет в свою таблицу несколько раз....

надеюсь что обрыва быть не должно но мало ли
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #33877372
domanix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не опасайся.
На то и придумали транзакции чтобы либо все операции, инициированные внутри транзакции выполнились - лобо ни одной.
Как только сервер определит, что произошел обрыв связи с клиентом - он сразу выполнит откат текущей транзакции.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
функции и транзакции - ?
    #35076706
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читал, но так и не понял.
Могу ли я, вызывая функцию указать желаемый тип транзакции?
Хотелось бы указать Read committed вместо обычного Serializable.
...
Рейтинг: 0 / 0
функции и транзакции - ?
    #35077336
Nick Gazaloff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tadminчитал, но так и не понял.
Могу ли я, вызывая функцию указать желаемый тип транзакции?
Хотелось бы указать Read committed вместо обычного Serializable.

Код: plaintext
1.
2.
3.
4.
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT my_function();
COMMIT;

В версии 8.3 можно при создании функции задать default_transaction_isolation.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / функции и транзакции - ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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