powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функции и транзакции
39 сообщений из 39, показаны все 2 страниц
Функции и транзакции
    #39287939
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли определить находясь в функции - была ли она вызвана в транзакции?
Возможно, у меня неправильный подход, но вот пример, навеянный подходом в SQL Server

Функция1
----------
...
если вызвана НЕ в открытой транзакции -
{
begin transaction;
}

..
вызов Функции2();
если была ошибка
{
если транзакция открыта в этой функции rollback;
return;
}
...
commit;
--------------end


Функция2
----------
...
если вызвана НЕ в открытой транзакции -
{
begin transaction;
}

..
...
если транзакция окрыта в этой функции
{
commit or rollback;
}
вернуть код или exception;
-------------- end


Какая практика в PostgreSQL?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287942
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

в postgresql хранимки выполняются всегда в транзакции.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287950
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MelkijРолг Хупин,

в postgresql хранимки выполняются всегда в транзакции.


Да, нашел, что в функциях нельзя открывать/закрывать транзакции.

Правильно ли я понимаю:

Код: sql
1.
select myfunc(1); -- выполняется в автоматически создаваемой транзакции?



что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287953
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинMelkijРолг Хупин,

в postgresql хранимки выполняются всегда в транзакции.


Да, нашел, что в функциях нельзя открывать/закрывать транзакции.

Правильно ли я понимаю:

Код: sql
1.
select myfunc(1); -- выполняется в автоматически создаваемой транзакции?



что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции?

savepoint в доке postgresql.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287955
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть, вот такой запрос практически не имеет смысла, поскольку по факту - одна транзакция (в функции)?

Код: sql
1.
2.
3.
begin transaction;
select myfunc(1);
commit;
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287957
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг Хупинпропущено...



Да, нашел, что в функциях нельзя открывать/закрывать транзакции.

Правильно ли я понимаю:

Код: sql
1.
select myfunc(1); -- выполняется в автоматически создаваемой транзакции?



что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции?

savepoint в доке postgresql.

--
Maxim Boguk
www.postgresql-consulting.ru

я имел в виду немного другое наверное

функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит.
Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287961
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинMaxim Bogukпропущено...


savepoint в доке postgresql.

--
Maxim Boguk
www.postgresql-consulting.ru

я имел в виду немного другое наверное

функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит.
Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком?

RAISE EXCEPTION сделать.

Или вызывать в явной транзакции и по результатам делать commit или rollback.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287971
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг Хупинпропущено...


я имел в виду немного другое наверное

функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит.
Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком?

RAISE EXCEPTION сделать.

Или вызывать в явной транзакции и по результатам делать commit или rollback.

--
Maxim Boguk
www.postgresql-consulting.ru

ясно, спасибо. еще:

если функция1 вызывает функцию2, а та - функцию3, значит ли это, что будут три вложенные
транзакции?
и что будет в случае, если функция3 завершится нормально (неявный коммит),
а вот функция2 сгенерирует RAISE EXCEPTION ?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39287985
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Будет 1 транзакция, вне зависимости от вложения ф-ий — та, в рамках которой была вызвана самая первая ф-ия.

Завершение функции к коммиту (неважно какому) не приводит, т.к. функция выполняется в рамках транзакции запроса, который её вызвал. (Потому и функции, в отличии от О! процедур.)

Если функция кидает исключение и его никто не ловит, то запрос считается ошибочным и транзакция откатывается либо целиком, либо до точки (если она была).
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288065
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

поцгрес как и аракел не придерживается абсракции "вложенных транзакций"
вместо них используется эквивалентная концепция "сейвпойнтов"
которые могут быть как "явными" -- sql--savepoint так и неявными -- plpgslq: begin [savepoint here] ... exception when ... end;


факультативноэ: на любом сейвпойнте в пж наваривается счётчик транзакций (на т.н. сабтранзакциях).
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288075
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovРолг Хупин,

Будет 1 транзакция, вне зависимости от вложения ф-ий — та, в рамках которой была вызвана самая первая ф-ия.

Завершение функции к коммиту (неважно какому) не приводит, т.к. функция выполняется в рамках транзакции запроса, который её вызвал. (Потому и функции, в отличии от О! процедур.)

Если функция кидает исключение и его никто не ловит, то запрос считается ошибочным и транзакция откатывается либо целиком, либо до точки (если она была).

То есть, если я правильно понял:

я в приложении делаю запрос

Код: sql
1.
select fun1();



fun1() вызывает fun2(), которая вызывает fun3()

fun3 успевает что-то сделать, а fun2 генерирует исключение
(явно или нет, не важно),
результат - роллбэк всего запроса select fun1();
включая роллбэк действий, уже сделанных fun3()

так?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288150
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь нашел небольшое обсуждение, интересны два последних примера, точнеее - второй
Что получается: есть явная транзакция, затем функция выолняется в своей неявной транзакции или же делает неявный
begin savepoint?


http://postgresql.ru.net/node/214388

Получается, что функция как бы транзакция в транзакции, и не очень-то это хорошо, хотя бы потому что это неочевидно!
Хотя что называется, почувствуйте разницу:
1. Берём вариант функции БЕЗ обработки исключения:
CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
INSERT INTO t2 (f1) VALUES (1);
INSERT INTO t2 (f1) VALUES (2);
INSERT INTO t2 (f1) VALUES (3);
raise exception 'Oooooppsss!';
INSERT INTO t2 (f1) VALUES (4);
RETURN 1;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
$tmp=# BEGIN;
BEGIN
tmp=# INSERT INTO t2 (f1) VALUES (5);
INSERT 0 1
tmp=# SELECT fntrans();
ERROR: Oooooppsss!
tmp=# COMMIT;
ROLLBACK
tmp=# select * from t2;
f1
----
(0 rows)
Т.е. после COMMIT, выполнился ROLLBACK и INSERT который был вызван внутри транзакции перед функцией не выполнился.

2. Берём вариант функции C обработкой исключения:
CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
INSERT INTO t2 (f1) VALUES (1);
INSERT INTO t2 (f1) VALUES (2);
INSERT INTO t2 (f1) VALUES (3);
raise exception 'Oooooppsss!';
INSERT INTO t2 (f1) VALUES (4);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
tmp=# BEGIN;
BEGIN
tmp=# INSERT INTO t2 (f1) VALUES (5);
INSERT 0 1
tmp=# SELECT fntrans();
fntrans
---------
0
(1 row)
tmp=# COMMIT;
COMMIT
tmp=# select * from t2;
f1
----
5
(1 row)
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288198
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинТ.е. после COMMIT, выполнился ROLLBACK и INSERT который был вызван внутри транзакции перед функцией не выполнился.
Неверное утверждение, тут COMMIT-а не было, вместо него произошел ROLLBACK.
Именно так стоит рассматривать этот ответ сервера.

Ролг Хупин2. Берём вариант функции C обработкой исключения:
CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
INSERT INTO t2 (f1) VALUES (1);
INSERT INTO t2 (f1) VALUES (2);
INSERT INTO t2 (f1) VALUES (3);
raise exception 'Oooooppsss!';
INSERT INTO t2 (f1) VALUES (4);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
tmp=# BEGIN;
BEGIN
tmp=# INSERT INTO t2 (f1) VALUES (5);
INSERT 0 1
tmp=# SELECT fntrans();
fntrans
---------
0
(1 row)
tmp=# COMMIT;
COMMIT
tmp=# select * from t2;
f1
----
5
(1 row)
Как и ожидалось.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288199
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупиня в приложении делаю запрос

Код: sql
1.
select fun1();



fun1() вызывает fun2(), которая вызывает fun3()

fun3 успевает что-то сделать, а fun2 генерирует исключение
(явно или нет, не важно),
результат - роллбэк всего запроса select fun1();
включая роллбэк действий, уже сделанных fun3()

так?Да, именно так.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288365
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Ролг Хупин]vyegorovРолг Хупин,



fun1() вызывает fun2(), которая вызывает fun3()

fun3 успевает что-то сделать, а fun2 генерирует исключение
(явно или нет, не важно),
результат - роллбэк всего запроса select fun1();
включая роллбэк действий, уже сделанных fun3()

так?

Да так.


--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288405
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Maxim Boguk]Ролг Хупинпропущено...


Да так.


--
Maxim Boguk
www.postgresql-consulting.ru

ясно, дальше

Сделал три функции, 1->2->3

Комбинирую raise exception например так, в любом случае в таблице записей нет.
А можно ли во внутренней функции так поймать exception, чтобы вызвавшая её все-таки сработала?



Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION "public"."fntrans" (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
raise notice 'fntrans';
  INSERT INTO t2 (f1) VALUES (1);
  INSERT INTO t2 (f1) VALUES (2);
  INSERT INTO t2 (f1) VALUES (3);

  select fntrans2();
--  raise exception 'Oooooppsss!';
  INSERT INTO t2 (f1) VALUES (4);
  RETURN 1;
EXCEPTION  
  WHEN OTHERS THEN 
  BEGIN 
  	raise notice 'fntrans exception';
	RETURN 0;
  END;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
  raise notice 'fntrans2';
  INSERT INTO t2 (f1) VALUES (10);
  INSERT INTO t2 (f1) VALUES (22);
  INSERT INTO t2 (f1) VALUES (30);
  select fntrans3();
  --raise exception 'Oooooppsss 2!';
  INSERT INTO t2 (f1) VALUES (40);
  RETURN 1;
EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;

CREATE OR REPLACE FUNCTION public.fntrans3 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
   raise notice 'fntrans3';
    
  INSERT INTO t2 (f1) VALUES (100);
  INSERT INTO t2 (f1) VALUES (200);
  INSERT INTO t2 (f1) VALUES (300);
  raise exception 'Oooooppsss 3!';
  INSERT INTO t2 (f1) VALUES (400);
  RETURN 1;
EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


SELECT fntrans();

Select * from t2;

-- записей нет
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288433
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Код: 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.
CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
  raise notice 'fntrans2';
  INSERT INTO t2 (f1) VALUES (10);
  INSERT INTO t2 (f1) VALUES (22);
  INSERT INTO t2 (f1) VALUES (30);

  BEGIN --savepoint? ,kzlm
      select fntrans3();
      raise exception 'Oooooppsss 2!';
       INSERT INTO t2 (f1) VALUES (40);
       RETURN 1;
  EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
  END;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288458
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин
Код: 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.
CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
  raise notice 'fntrans2';
  INSERT INTO t2 (f1) VALUES (10);
  INSERT INTO t2 (f1) VALUES (22);
  INSERT INTO t2 (f1) VALUES (30);

  BEGIN --savepoint? ,kzlm
      select fntrans3();
      raise exception 'Oooooppsss 2!';
       INSERT INTO t2 (f1) VALUES (40);
       RETURN 1;
  EXCEPTION  
  WHEN OTHERS THEN RETURN 0;
  END;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;




изменил так, как написано, но после вызова 1->2->3

SELECT fntrans();

Select * from t2;

таблица пустая
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288462
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме всего вот аутпут, который показывает, что то исключение все-таки пробило на самый верх

NOTICE: fntrans
NOTICE: fntrans2
CONTEXT: SQL statement "select fntrans2()"
PL/pgSQL function fntrans() line 8 at SQL statement
NOTICE: fntrans3
CONTEXT: SQL statement "select fntrans3()"
PL/pgSQL function fntrans2() line 10 at SQL statement
SQL statement "select fntrans2()"
PL/pgSQL function fntrans() line 8 at SQL statement
NOTICE: fntrans exception
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288481
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

мальчик , ты дебил ?

разберись сначала с единственным сейвпойнтом

Код: 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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
	raise notice 'fntrans2';
	INSERT INTO t2 (f1) VALUES (10);
	INSERT INTO t2 (f1) VALUES (22);
	INSERT INTO t2 (f1) VALUES (30);

	BEGIN --savepoint? ,kzlm

			raise exception 'Oooooppsss 2!';
			INSERT INTO t2 (f1) VALUES (40);
			RETURN 1;
	EXCEPTION	
	WHEN OTHERS THEN RETURN 0;
	END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;

SELECT public.fntrans2();
SELECT * FROM t2;
---------------------
1;10
2;22
3;30


потом нанизывай их одно на другое.
И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288488
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин,

мальчик , ты дебил ?

разберись сначала с единственным сейвпойнтом

Код: 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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
	raise notice 'fntrans2';
	INSERT INTO t2 (f1) VALUES (10);
	INSERT INTO t2 (f1) VALUES (22);
	INSERT INTO t2 (f1) VALUES (30);

	BEGIN --savepoint? ,kzlm

			raise exception 'Oooooppsss 2!';
			INSERT INTO t2 (f1) VALUES (40);
			RETURN 1;
	EXCEPTION	
	WHEN OTHERS THEN RETURN 0;
	END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;

[color=red]SELECT public.fntrans2();
SELECT * FROM t2;[/color]
---------------------
1;10
2;22
3;30


потом нанизывай их одно на другое.
И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится.

Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке
И я не хотел бы давать вам оценку.

Разница есть в том примере. который я привел и в вашем?

SELECT fntrans();
Select * from t2;

Так вот я задал вопрос про три функции и привел их.
Вы дали совет как исправить, но вызов не тот, который в моем примере, а следовательно это не ответ на мой вопрос.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288505
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинqwwqРолг Хупин,

мальчик , ты дебил ?

разберись сначала с единственным сейвпойнтом

Код: 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.
create table t2(ID SERIAL PRIMARY KEY, f1 INTeger);

CREATE OR REPLACE FUNCTION public.fntrans2 (
)
RETURNS integer AS
$body$
declare d double precision;
BEGIN
	raise notice 'fntrans2';
	INSERT INTO t2 (f1) VALUES (10);
	INSERT INTO t2 (f1) VALUES (22);
	INSERT INTO t2 (f1) VALUES (30);

	BEGIN --savepoint? ,kzlm

			raise exception 'Oooooppsss 2!';
			INSERT INTO t2 (f1) VALUES (40);
			RETURN 1;
	EXCEPTION	
	WHEN OTHERS THEN RETURN 0;
	END;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE;

[color=red]SELECT public.fntrans2();
SELECT * FROM t2;[/color]
---------------------
1;10
2;22
3;30


потом нанизывай их одно на другое.
И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится.

Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке
И я не хотел бы давать вам оценку.

Разница есть в том примере. который я привел и в вашем?

SELECT fntrans();
Select * from t2;

Так вот я задал вопрос про три функции и привел их.
Вы дали совет как исправить, но вызов не тот, который в моем примере, а >>>следовательно<<< это не ответ на мой вопрос.

таки да, мальчик ещё и не читатель

ещё раз повторяю -- от простого -- к сложному
сначала -- поведение при одном сейвпойнте в цепочке
и только потом --- инжекция туда новых проблем
а широко шагать -- штаны порвёшь
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288512
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупинпропущено...


Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке
И я не хотел бы давать вам оценку.

Разница есть в том примере. который я привел и в вашем?

SELECT fntrans();
Select * from t2;

Так вот я задал вопрос про три функции и привел их.
Вы дали совет как исправить, но вызов не тот, который в моем примере, а >>>следовательно<<< это не ответ на мой вопрос.

таки да, мальчик ещё и не читатель

ещё раз повторяю -- от простого -- к сложному
сначала -- поведение при одном сейвпойнте в цепочке
и только потом --- инжекция туда новых проблем
а широко шагать -- штаны порвёшь

У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо.

Ладно, к вопросу:


Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться.

"поведение при одном сейвпойнте в цепочке"

Да, при вызове fntrans2() exception ловится внутри функции при ее вызове.

Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове
fntrans()->fntrans2()
?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288513
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин

У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо.
не юзеров, а дебилов. когда они ещё и мельтешат не думая.
Ролг Хупин
Ладно, к вопросу:


Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться.

"поведение при одном сейвпойнте в цепочке"

Да, при вызове fntrans2() exception ловится внутри функции при ее вызове.

Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове
fntrans()->fntrans2()
?

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

раз не хотите по шагам -- давайте весь ваш бред целиком

мну, например, совсем не очевидно, что "пробивает" именно этот, и именно там.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288515
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин

У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо.
не юзеров, а дебилов. когда они ещё и мельтешат не думая.
Ролг Хупин
Ладно, к вопросу:


Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться.

"поведение при одном сейвпойнте в цепочке"

Да, при вызове fntrans2() exception ловится внутри функции при ее вызове.

Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове
fntrans()->fntrans2()
?

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

Так я его и привел в вопросе
раз не хотите по шагам -- давайте весь ваш бред целиком

мну, например, совсем не очевидно, что "пробивает" именно этот, и именно там.

Зря вы так: " не юзеров, а дебилов. когда они ещё и мельтешат не думая. "
вы вряд ли дебил, вроде соображаете.
Хотя, одно другому не мешает, а иногда и совмещается ;-)

Спасибо вам, добрый юзер,
разобрался наконец-то, это был другой эксцепшын, родной для функции fntrans

из-за вызова в ней
select fntrans2(), типа дискард дата и пр., заменил на perform fntrans2() и всё сработало!


зы. вы заметили, я не отвечаю на грубые слова, не матерюсь, это потому что я в завязке
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288520
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинqwwqпропущено...
не юзеров, а дебилов. когда они ещё и мельтешат не думая.
пропущено...


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

Так я его и привел в вопросе
раз не хотите по шагам -- давайте весь ваш бред целиком


Так я его и привел в вопросе

где ?

мы имели какой то бред.
потом предложение его исправить
потом обрывки соплей о том, что где--то что--то как--то исправлено, и никакого полного текста нового кейса

и да, вы очевидно блондинко, раз злоупотре,простите,бл@ете смайлеками и прочим
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288552
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупинпропущено...

Так я его и привел в вопросе

где ?

мы имели какой то бред.
потом предложение его исправить
потом обрывки соплей о том, что где--то что--то как--то исправлено, и никакого полного текста нового кейса

и да, вы очевидно блондинко, раз злоупотре,простите,бл@ете смайлеками и прочим

http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1225897&msg=19516495
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288553
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупинпропущено...

Так я его и привел в вопросе

где ?

мы имели какой то бред.
потом предложение его исправить
потом обрывки соплей о том, что где--то что--то как--то исправлено, и никакого полного текста нового кейса

и да, вы очевидно блондинко, раз злоупотре,простите,бл@ете смайлеками и прочим

Вы неуравновешены, выпейте пива, расслабьтесь, всё будет хорошо.
И я продолжу задавать вопросы ;-)
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288565
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1225897&msg=19516495
В последующих сообщениях вы говорите, что код меняли.
Приведите актуальный код функций (желательно под спойлером).
...
Рейтинг: 0 / 0
Функции и транзакции
    #39288576
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorovРолг Хупин http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1225897&msg=19516495
В последующих сообщениях вы говорите, что код меняли.
Приведите актуальный код функций (желательно под спойлером).

Я там написал "Комбинирую raise exception например так, в любом случае в таблице записей нет. "

т.е. код тот же.
И позднее я написал, что нашел ошибку по витиеватой подсказке qwwq, перемежающейся грубыми словами.

в функции ф1 надо было вместо селект сделать перформ , это и была эксцепция, т.е. не из функции ф3, а своя.

У меня нет опыта работы с постгресом, потому вынужден задавать возможно странные вопросы
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289242
GeniyZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что, если я в рамках одной общей явной транзакции в M$ SQL Server вызову поочереди несколько процедур и в последней будет ошибка, то изменения данных сделанные в предыдущих процедурах не отроллбэчатся??? 0_о а какже целостность данных?? Атомарность транзакций?
Или я неправильно понял Хупина Ролла?
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289245
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GeniyZ,

нет, там идеология "вложенных транзакций" (кажется с сайбейза ещё)

т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.

те же яйца, но вид в профиль.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289269
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqнет, там идеология "вложенных транзакций" (кажется с сайбейза ещё)

т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.Не так.
begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль.
commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается.
А вот rollback сбрасывает счетчик в ноль и откатывает все действия транзакции. То есть, вложенных транзакций на самом деле нет, есть просто счетчик, причем несимметричный относительно commit и rollback. Несимметричность и "утечка" счетчика является частой проблемой при разработке на t-sql. В сочетании с опциями неявных транзакций и сейвпоинтами получается гремучая смесь, в которой невозможно разобраться и отладить. В mssql-ных программах часто можно встретить цикл с коммитами до обнуления счетчика.
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289274
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.qwwqнет, там идеология "вложенных транзакций" (кажется с сайбейза ещё)

т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.Не так.
begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль.
commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается.
А вот rollback сбрасывает счетчик в ноль и откатывает все действия транзакции. То есть, вложенных транзакций на самом деле нет, есть просто счетчик, причем несимметричный относительно commit и rollback. Несимметричность и "утечка" счетчика является частой проблемой при разработке на t-sql. В сочетании с опциями неявных транзакций и сейвпоинтами получается гремучая смесь, в которой невозможно разобраться и отладить. В mssql-ных программах часто можно встретить цикл с коммитами до обнуления счетчика.

лайкнул
да, а если хочется иметь что-то типа субтранзакции, то savepoint
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289324
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль.
commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается.
В ПЖ так не прокатит, нужно либо использовать SAVEPOINT'ы (на уровне SQL), либо BEGIN ... END; блоки (в PL/pgSQL).
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289335
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.qwwqнет, там идеология "вложенных транзакций" (кажется с сайбейза ещё)

т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.Не так.
begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль.
commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается.
А вот rollback сбрасывает счетчик в ноль и откатывает все действия транзакции. То есть, вложенных транзакций на самом деле нет, есть просто счетчик, причем несимметричный относительно commit и rollback. Несимметричность и "утечка" счетчика является частой проблемой при разработке на t-sql. В сочетании с опциями неявных транзакций и сейвпоинтами получается гремучая смесь, в которой невозможно разобраться и отладить. В mssql-ных программах часто можно встретить цикл с коммитами до обнуления счетчика.
чо не так то ?
дай имя вложенной транзе и ролбачь к имени, а не всё чохом
https://msdn.microsoft.com/ru-ru/library/ms181299.aspx

а в ПЖ без имени сейвпойнта оно точно также всё и откатится, скоко сейвпойнтов не натычь.

//Другое дело ,, что в плпжскл все сейвпойнты в блоках исключений какбе неявно именные
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289337
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

хотя кажется вру -- "При вложении транзакций аргумент transaction_name должен быть именем транзакции из самой внешней инструкции BEGIN TRANSACTION."
т.е. жопа слово есть, а нахер ненужноэ ? чо--то смутно помницца, шо не так всё было в 6.5. когда деревья типа были большие и трава зеленее... мдяс
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289434
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqqwwq,

хотя кажется вру -- "При вложении транзакций аргумент transaction_name должен быть именем транзакции из самой внешней инструкции BEGIN TRANSACTION."
т.е. жопа слово есть, а нахер ненужноэ ? чо--то смутно помницца, шо не так всё было в 6.5 . когда деревья типа были большие и трава зеленее... мдяс

со всеми бывает, и толерантные юзеры не называют тебя разными словами, ну да ладно.

В 6.5 много чего не так было
...
Рейтинг: 0 / 0
Функции и транзакции
    #39289471
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупинсо всеми бывает, и толерантные юзеры не называют тебя разными словами, ну да ладно.

пионэры ? идите в джоппу , пионэры.



ПЫСЫ, кто помнит, в ms jet (msAccess) тоже только общий ролбак был вложенных транз ? или таки раздельный ? чота я засомневавлсо.
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функции и транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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