Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#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. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 12:16 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, непонятно - вторая процедура закрывает транзакцию, без её открытия? Почему это происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 12:53 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Владислав Колосов Ролг Хупин, непонятно - вторая процедура закрывает транзакцию, без её открытия? Почему это происходит? она по идее для того и предназначена в вызывающей процедуре открывается транзакция, что-то делается, может обломаться и вторая проверяет и закрывает, если остались открытые. Реально вторая процедура вызывается в begin try ... -- тут вызвается несколько процедур, одна из которых может выскочить с ошибкой end try begin catch exec ptest,1 end catch ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:26 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
и ошибка Msg 266, Level 16, State 2, Procedure ptest, Line 0 [Batch Start Line 34] Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 0. Вопрос: почему нельзя так сделать? во второй процедуре закрыть транзакции, точнее откатить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 13:27 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, потому что вы взорвете мозг тому, кто будет дорабатывать этот код после вас. Серьезно - не надо так делать. Сделайте себе лучше шаблон, который будет корректно поднимать транзакцию, если необходимо, или сохранять, если он запускается в уже существующей транзакции и так же откатывать либо всю транзакцию, либо откатываться к сохраненной точке. Как пример: http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/ Вот ответ от человека, который называет себя "Technical Architect working at the Microsoft Technology Center": https://dba.stackexchange.com/questions/212115/handling-transaction-count-after-execute-indicates-a-mismatching-number-of-begi Performing a ROLLBACK in a stored procedure that didn't start the transaction is also an error, and will generate this message. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 14:24 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Minamoto Ролг Хупин, потому что вы взорвете мозг тому, кто будет дорабатывать этот код после вас. Серьезно - не надо так делать. Сделайте себе лучше шаблон, который будет корректно поднимать транзакцию, если необходимо, или сохранять, если он запускается в уже существующей транзакции и так же откатывать либо всю транзакцию, либо откатываться к сохраненной точке. Как пример: http://rusanu.com/2009/06/11/exception-handling-and-nested-transactions/ Вот ответ от человека, который называет себя "Technical Architect working at the Microsoft Technology Center": https://dba.stackexchange.com/questions/212115/handling-transaction-count-after-execute-indicates-a-mismatching-number-of-begi Performing a ROLLBACK in a stored procedure that didn't start the transaction is also an error, and will generate this message. про взрыв мозга - согласен, но, скажем, вызывающая процедура вызвает 5 разных, одна из которых генерирует ошибку. Я вижу в таком случае - на выходе вызывающей остается незакрытая транзакция. Вот и подумал сделать процедуру типа ptest, но хотелось бы понять - почему ошибка возникает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 14:33 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин Я вижу в таком случае - на выходе вызывающей остается незакрытая транзакция. а не надо такое видеть. во всех внутренних в catch -- throw во внешней в catch -- rollback ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 14:41 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Yasha123 Ролг Хупин Я вижу в таком случае - на выходе вызывающей остается незакрытая транзакция. а не надо такое видеть. во всех внутренних в catch -- throw во внешней в catch -- rollback так работает, но тяга к знаниям закрутила, хотелось понять. внутренние процедуры писаны не мной, туда Заратустра не позволяет вмешиваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 14:46 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин, это поведение by design описанно в справке по rollback. можете поиграться: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. add: хотя на самом деле не совсем точно, потому что в справке написано что "This message does not affect subsequent processing" а по факту транзакция переходит в uncommitable state ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 15:50 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Ролг Хупин но хотелось бы понять - почему ошибка возникает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 17:31 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Yasha123 Ролг Хупин Я вижу в таком случае - на выходе вызывающей остается незакрытая транзакция. а не надо такое видеть. во всех внутренних в catch -- throw во внешней в catch -- rollback Садись - неуд. Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:01 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. что-то нету роллбэка, а xact_abort on есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 18:42 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
Yasha123 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. что-то нету роллбэка, а xact_abort on есть Суслика нет, а он есть. Фсе работает. Там где надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 06:37 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
aleks222 Суслика нет, а он есть. и имя ему алекс-двоечник. роллбэка правда так и нет в моем примере aleks222 Фсе работает. Там где надо. еще бы. надо в паре с try..catch. который суслик не захотел признать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 10:51 |
|
||
|
Транзакции: закрыть внутри процедуры
|
|||
|---|---|---|---|
|
#18+
aleks222 Yasha123 Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. что-то нету роллбэка, а xact_abort on есть Суслика нет, а он есть. Фсе работает. Там где надо. в моем примере (см. первый мєсиджь) не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2019, 11:17 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39895425&tid=1686876]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
83ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 421ms |

| 0 / 0 |
