Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупинqwwqпропущено... не юзеров, а дебилов. когда они ещё и мельтешат не думая. пропущено... приведите весь текст своего кейса (заново, целиком, в спойлере) -- и будет ясно, что именно вы делаете, и, что из этого получается. Так я его и привел в вопросе раз не хотите по шагам -- давайте весь ваш бред целиком Так я его и привел в вопросе где ? мы имели какой то бред. потом предложение его исправить потом обрывки соплей о том, что где--то что--то как--то исправлено, и никакого полного текста нового кейса и да, вы очевидно блондинко, раз злоупотре,простите,бл@ете смайлеками и прочим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 18:29 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwqРолг Хупинпропущено... Так я его и привел в вопросе где ? мы имели какой то бред. потом предложение его исправить потом обрывки соплей о том, что где--то что--то как--то исправлено, и никакого полного текста нового кейса и да, вы очевидно блондинко, раз злоупотре,простите,бл@ете смайлеками и прочим http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1225897&msg=19516495 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 19:33 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwqРолг Хупинпропущено... Так я его и привел в вопросе где ? мы имели какой то бред. потом предложение его исправить потом обрывки соплей о том, что где--то что--то как--то исправлено, и никакого полного текста нового кейса и да, вы очевидно блондинко, раз злоупотре,простите,бл@ете смайлеками и прочим Вы неуравновешены, выпейте пива, расслабьтесь, всё будет хорошо. И я продолжу задавать вопросы ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 19:34 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1225897&msg=19516495 В последующих сообщениях вы говорите, что код меняли. Приведите актуальный код функций (желательно под спойлером). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 20:09 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
vyegorovРолг Хупин http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1225897&msg=19516495 В последующих сообщениях вы говорите, что код меняли. Приведите актуальный код функций (желательно под спойлером). Я там написал "Комбинирую raise exception например так, в любом случае в таблице записей нет. " т.е. код тот же. И позднее я написал, что нашел ошибку по витиеватой подсказке qwwq, перемежающейся грубыми словами. в функции ф1 надо было вместо селект сделать перформ , это и была эксцепция, т.е. не из функции ф3, а своя. У меня нет опыта работы с постгресом, потому вынужден задавать возможно странные вопросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2016, 20:47 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
А что, если я в рамках одной общей явной транзакции в M$ SQL Server вызову поочереди несколько процедур и в последней будет ошибка, то изменения данных сделанные в предыдущих процедурах не отроллбэчатся??? 0_о а какже целостность данных?? Атомарность транзакций? Или я неправильно понял Хупина Ролла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 18:53 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
GeniyZ, нет, там идеология "вложенных транзакций" (кажется с сайбейза ещё) т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется. те же яйца, но вид в профиль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 19:02 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwqнет, там идеология "вложенных транзакций" (кажется с сайбейза ещё) т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.Не так. begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль. commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается. А вот rollback сбрасывает счетчик в ноль и откатывает все действия транзакции. То есть, вложенных транзакций на самом деле нет, есть просто счетчик, причем несимметричный относительно commit и rollback. Несимметричность и "утечка" счетчика является частой проблемой при разработке на t-sql. В сочетании с опциями неявных транзакций и сейвпоинтами получается гремучая смесь, в которой невозможно разобраться и отладить. В mssql-ных программах часто можно встретить цикл с коммитами до обнуления счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 19:47 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
p2.qwwqнет, там идеология "вложенных транзакций" (кажется с сайбейза ещё) т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.Не так. begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль. commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается. А вот rollback сбрасывает счетчик в ноль и откатывает все действия транзакции. То есть, вложенных транзакций на самом деле нет, есть просто счетчик, причем несимметричный относительно commit и rollback. Несимметричность и "утечка" счетчика является частой проблемой при разработке на t-sql. В сочетании с опциями неявных транзакций и сейвпоинтами получается гремучая смесь, в которой невозможно разобраться и отладить. В mssql-ных программах часто можно встретить цикл с коммитами до обнуления счетчика. лайкнул да, а если хочется иметь что-то типа субтранзакции, то savepoint ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 19:59 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
p2.begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль. commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается. В ПЖ так не прокатит, нужно либо использовать SAVEPOINT'ы (на уровне SQL), либо BEGIN ... END; блоки (в PL/pgSQL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 22:38 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
p2.qwwqнет, там идеология "вложенных транзакций" (кажется с сайбейза ещё) т.е. вы можете откатить внутреннюю, и все, вложенные в неё откатятся, но то, что вовне откаченной -- останется.Не так. begin transaction увеличивает счетчик уровня вложенности транзакций и начинает транзакцию, если уровень был ноль. commit уменьшает счетчик вложенности транзакции и, если ноль, то транзакция подтверждается. А вот rollback сбрасывает счетчик в ноль и откатывает все действия транзакции. То есть, вложенных транзакций на самом деле нет, есть просто счетчик, причем несимметричный относительно commit и rollback. Несимметричность и "утечка" счетчика является частой проблемой при разработке на t-sql. В сочетании с опциями неявных транзакций и сейвпоинтами получается гремучая смесь, в которой невозможно разобраться и отладить. В mssql-ных программах часто можно встретить цикл с коммитами до обнуления счетчика. чо не так то ? дай имя вложенной транзе и ролбачь к имени, а не всё чохом https://msdn.microsoft.com/ru-ru/library/ms181299.aspx а в ПЖ без имени сейвпойнта оно точно также всё и откатится, скоко сейвпойнтов не натычь. //Другое дело ,, что в плпжскл все сейвпойнты в блоках исключений какбе неявно именные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 00:28 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwq, хотя кажется вру -- "При вложении транзакций аргумент transaction_name должен быть именем транзакции из самой внешней инструкции BEGIN TRANSACTION." т.е. жопа слово есть, а нахер ненужноэ ? чо--то смутно помницца, шо не так всё было в 6.5. когда деревья типа были большие и трава зеленее... мдяс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 00:36 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
qwwqqwwq, хотя кажется вру -- "При вложении транзакций аргумент transaction_name должен быть именем транзакции из самой внешней инструкции BEGIN TRANSACTION." т.е. жопа слово есть, а нахер ненужноэ ? чо--то смутно помницца, шо не так всё было в 6.5 . когда деревья типа были большие и трава зеленее... мдяс со всеми бывает, и толерантные юзеры не называют тебя разными словами, ну да ладно. В 6.5 много чего не так было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 09:40 |
|
||
|
Функции и транзакции
|
|||
|---|---|---|---|
|
#18+
Ролг Хупинсо всеми бывает, и толерантные юзеры не называют тебя разными словами, ну да ладно. пионэры ? идите в джоппу , пионэры. ПЫСЫ, кто помнит, в ms jet (msAccess) тоже только общий ролбак был вложенных транз ? или таки раздельный ? чота я засомневавлсо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 10:34 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1997060]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 308ms |

| 0 / 0 |
