Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Можно ли определить находясь в функции - была ли она вызвана в транзакции? Возможно, у меня неправильный подход, но вот пример, навеянный подходом в SQL Server Функция1 ---------- ... если вызвана НЕ в открытой транзакции - { begin transaction; } .. вызов Функции2(); если была ошибка { если транзакция открыта в этой функции rollback; return; } ... commit; --------------end Функция2 ---------- ... если вызвана НЕ в открытой транзакции - { begin transaction; } .. ... если транзакция окрыта в этой функции { commit or rollback; } вернуть код или exception; -------------- end Какая практика в PostgreSQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 18:10 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, в postgresql хранимки выполняются всегда в транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 18:23 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
MelkijРолг Хупин, в postgresql хранимки выполняются всегда в транзакции. Да, нашел, что в функциях нельзя открывать/закрывать транзакции. Правильно ли я понимаю: Код: sql 1. что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 18:44 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг ХупинMelkijРолг Хупин, в postgresql хранимки выполняются всегда в транзакции. Да, нашел, что в функциях нельзя открывать/закрывать транзакции. Правильно ли я понимаю: Код: sql 1. что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции? savepoint в доке postgresql. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 19:04 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
То есть, вот такой запрос практически не имеет смысла, поскольку по факту - одна транзакция (в функции)? Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 19:13 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Maxim BogukРолг Хупинпропущено... Да, нашел, что в функциях нельзя открывать/закрывать транзакции. Правильно ли я понимаю: Код: sql 1. что надо сделать внутри функции, если посреди выполнения что-то возникло, чтобы откатить эту транзакцию до начала функции? savepoint в доке postgresql. -- Maxim Boguk www.postgresql-consulting.ru я имел в виду немного другое наверное функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит. Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 19:17 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг ХупинMaxim Bogukпропущено... savepoint в доке postgresql. -- Maxim Boguk www.postgresql-consulting.ru я имел в виду немного другое наверное функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит. Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком? RAISE EXCEPTION сделать. Или вызывать в явной транзакции и по результатам делать commit или rollback. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 19:29 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Maxim BogukРолг Хупинпропущено... я имел в виду немного другое наверное функция выполняется всегда в своей транзакции, и если все ок, то будет выполнен неявный коммит. Как надо завершить или что надо сделать в функции, чтобы она завершилась своим неявным роллбэком? RAISE EXCEPTION сделать. Или вызывать в явной транзакции и по результатам делать commit или rollback. -- Maxim Boguk www.postgresql-consulting.ru ясно, спасибо. еще: если функция1 вызывает функцию2, а та - функцию3, значит ли это, что будут три вложенные транзакции? и что будет в случае, если функция3 завершится нормально (неявный коммит), а вот функция2 сгенерирует RAISE EXCEPTION ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 20:39 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, Будет 1 транзакция, вне зависимости от вложения ф-ий — та, в рамках которой была вызвана самая первая ф-ия. Завершение функции к коммиту (неважно какому) не приводит, т.к. функция выполняется в рамках транзакции запроса, который её вызвал. (Потому и функции, в отличии от О! процедур.) Если функция кидает исключение и его никто не ловит, то запрос считается ошибочным и транзакция откатывается либо целиком, либо до точки (если она была). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2016, 21:30 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, поцгрес как и аракел не придерживается абсракции "вложенных транзакций" вместо них используется эквивалентная концепция "сейвпойнтов" которые могут быть как "явными" -- sql--savepoint так и неявными -- plpgslq: begin [savepoint here] ... exception when ... end; факультативноэ: на любом сейвпойнте в пж наваривается счётчик транзакций (на т.н. сабтранзакциях). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 08:57 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
vyegorovРолг Хупин, Будет 1 транзакция, вне зависимости от вложения ф-ий — та, в рамках которой была вызвана самая первая ф-ия. Завершение функции к коммиту (неважно какому) не приводит, т.к. функция выполняется в рамках транзакции запроса, который её вызвал. (Потому и функции, в отличии от О! процедур.) Если функция кидает исключение и его никто не ловит, то запрос считается ошибочным и транзакция откатывается либо целиком, либо до точки (если она была). То есть, если я правильно понял: я в приложении делаю запрос Код: sql 1. fun1() вызывает fun2(), которая вызывает fun3() fun3 успевает что-то сделать, а fun2 генерирует исключение (явно или нет, не важно), результат - роллбэк всего запроса select fun1(); включая роллбэк действий, уже сделанных fun3() так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 09:11 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Здесь нашел небольшое обсуждение, интересны два последних примера, точнеее - второй Что получается: есть явная транзакция, затем функция выолняется в своей неявной транзакции или же делает неявный 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 11:15 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг ХупинТ.е. после 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) Как и ожидалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 12:02 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупиня в приложении делаю запрос Код: sql 1. fun1() вызывает fun2(), которая вызывает fun3() fun3 успевает что-то сделать, а fun2 генерирует исключение (явно или нет, не важно), результат - роллбэк всего запроса select fun1(); включая роллбэк действий, уже сделанных fun3() так?Да, именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 12:03 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
[quot Ролг Хупин]vyegorovРолг Хупин, fun1() вызывает fun2(), которая вызывает fun3() fun3 успевает что-то сделать, а fun2 генерирует исключение (явно или нет, не важно), результат - роллбэк всего запроса select fun1(); включая роллбэк действий, уже сделанных fun3() так? Да так. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 15:14 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
[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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 16:03 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 16:34 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
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. изменил так, как написано, но после вызова 1->2->3 SELECT fntrans(); Select * from t2; таблица пустая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 17:00 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Кроме всего вот аутпут, который показывает, что то исключение все-таки пробило на самый верх 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 17:02 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, мальчик , ты дебил ? разберись сначала с единственным сейвпойнтом Код: 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. потом нанизывай их одно на другое. И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 17:31 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
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. потом нанизывай их одно на другое. И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится. Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке И я не хотел бы давать вам оценку. Разница есть в том примере. который я привел и в вашем? SELECT fntrans(); Select * from t2; Так вот я задал вопрос про три функции и привел их. Вы дали совет как исправить, но вызов не тот, который в моем примере, а следовательно это не ответ на мой вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 17:37 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин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. потом нанизывай их одно на другое. И если подавляешь чужое исключение -- выводи хотя бы его следы (SQLERRM SQLSTATE) в своих сообщениях -- могабыть оно вообще на что--то другое матерится. Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке И я не хотел бы давать вам оценку. Разница есть в том примере. который я привел и в вашем? SELECT fntrans(); Select * from t2; Так вот я задал вопрос про три функции и привел их. Вы дали совет как исправить, но вызов не тот, который в моем примере, а >>>следовательно<<< это не ответ на мой вопрос. таки да, мальчик ещё и не читатель ещё раз повторяю -- от простого -- к сложному сначала -- поведение при одном сейвпойнте в цепочке и только потом --- инжекция туда новых проблем а широко шагать -- штаны порвёшь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 17:55 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwqРолг Хупинпропущено... Я будуу обращаться к вам на вы, судя по всему у вас с нервной системой не все в порядке И я не хотел бы давать вам оценку. Разница есть в том примере. который я привел и в вашем? SELECT fntrans(); Select * from t2; Так вот я задал вопрос про три функции и привел их. Вы дали совет как исправить, но вызов не тот, который в моем примере, а >>>следовательно<<< это не ответ на мой вопрос. таки да, мальчик ещё и не читатель ещё раз повторяю -- от простого -- к сложному сначала -- поведение при одном сейвпойнте в цепочке и только потом --- инжекция туда новых проблем а широко шагать -- штаны порвёшь У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо. Ладно, к вопросу: Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться. "поведение при одном сейвпойнте в цепочке" Да, при вызове fntrans2() exception ловится внутри функции при ее вызове. Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове fntrans()->fntrans2() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 18:02 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо. не юзеров, а дебилов. когда они ещё и мельтешат не думая. Ролг Хупин Ладно, к вопросу: Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться. "поведение при одном сейвпойнте в цепочке" Да, при вызове fntrans2() exception ловится внутри функции при ее вызове. Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове fntrans()->fntrans2() ? приведите весь текст своего кейса (заново, целиком, в спойлере) -- и будет ясно, что именно вы делаете, и, что из этого получается. раз не хотите по шагам -- давайте весь ваш бред целиком мну, например, совсем не очевидно, что "пробивает" именно этот, и именно там. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 18:09 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwqРолг Хупин У вас навязчивое желание называть юзеров "мальчег", это нетрадициионо. не юзеров, а дебилов. когда они ещё и мельтешат не думая. Ролг Хупин Ладно, к вопросу: Если бы я был в курсе я бы не задавал вопросы, хотелось бы разобраться. "поведение при одном сейвпойнте в цепочке" Да, при вызове fntrans2() exception ловится внутри функции при ее вызове. Вопрос: почему этот exception пробивает в вызвавшую функцию при вызове fntrans()->fntrans2() ? приведите весь текст своего кейса (заново, целиком, в спойлере) -- и будет ясно, что именно вы делаете, и, что из этого получается. Так я его и привел в вопросе раз не хотите по шагам -- давайте весь ваш бред целиком мну, например, совсем не очевидно, что "пробивает" именно этот, и именно там. Зря вы так: " не юзеров, а дебилов. когда они ещё и мельтешат не думая. " вы вряд ли дебил, вроде соображаете. Хотя, одно другому не мешает, а иногда и совмещается ;-) Спасибо вам, добрый юзер, разобрался наконец-то, это был другой эксцепшын, родной для функции fntrans из-за вызова в ней select fntrans2(), типа дискард дата и пр., заменил на perform fntrans2() и всё сработало! зы. вы заметили, я не отвечаю на грубые слова, не матерюсь, это потому что я в завязке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 18:22 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39288462&tid=1997060]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
73ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 263ms |
| total: | 443ms |

| 0 / 0 |
