Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
Есть некий обЪект, хранящийся в нескольких таблицах. Каждая таблица - это группы независимых между собой аттрибутов. Соответственно для каждой группы (таблицы) есть своя SP для сохранения данных. И есть SP сохранения данных по всему обЪекту, вызывающая эти, так сказать, подSP. Если подSP дергается самостоятельно, то она сама стартует транзакцию и рулит ею. А если стартуется главная SP обЪекта - то она создает глобальную транзакцию и все подSP уже выполняются в ее контексте. Дык как в подSP узнать - в контексте транзакции ли она стартовала? Шо-то а-ля: Код: plaintext 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. "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 18:25 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
P.S. I'm so sorry... select @@version Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003 _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 18:34 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
Ну во первых, управлять транзакциями изнутри хранимой процедуры это не комильфо. Оставь клиенткое клиенту. А во вторых, всегда можно прочитать системную перменную @@trancount . Получишь текущий уровень вложеных транзакций (для обеих БД). --- http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 18:40 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
White OwlНу во первых, управлять транзакциями изнутри хранимой процедуры это не комильфо. Оставь клиенткое клиенту. Это ОЧЕНЬ спорный вопрос. Я бы его изложил ровно в противоположную сторону. Транзакции НИКОГДА не должны управляться с клиента. Нужна тебе транзакция - напиши процедуру. Нужна еще большая транзакция - напиши другую процедуру и вызови из нее данную и другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 02:39 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
Тут может быть несколько подходов (но все базируются на анализе @@trancount, потому что другого способа проверить начата ли транзакция нет). Мы вводили практику использования стандартных пролога и эпилога процедур. Я могу запостить один из вариантов пролога и эпилога. (найду только). Идея там простая - в прологе каждая процедура должа запомнить, была ли начата транзакция на момент ее старта. Потом она (в зависимости от применяемого способа) либо не начинает транзакцию, если она уже начата, и в эпилоге не коммитит, либо начинает, а потом в эпилоге всегда безусловно коммитит. В отношении ROLLBACK-ов -- процедура никогда не должна реально ROLLBACK-чить, если не она начинала транзакцию, а должна лишь вернуть ненулевой код возврата. Самая первая процедура, которая начинала транзакцию, должна собрать окончательно коды возврата и сделать ROLLBACK если что-то не так. При этом надо помнить о существовании режима CHAINED TRANSACTIONS, который я лично считаю просто чистым бредом, потому как не нужен он и неудобен, но он существует, и потенциально процедура может быть вызвана под CHAINED, но схема работы процедуры всегда расчитана либо на CHAINED , либо на UNCHAINED (как то, что я изложил выше). Запретить выполнение процедуры в ненужном ей режиме можно (и нужно) задав режим работы процедуры с помощью sp_procxmode . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 02:56 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
MasterZiv +1 У меня точно так же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 03:39 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
Вот один из вариантов стандартного пролога и эпилога: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. При этом действуют сограшения, что НИКОГДА в теле процедуры не ставится return. Только переход на метку OK или на метку FAILURE. и установка @rc в не ноль при ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 09:20 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
Да, еще в sybase.com.public.ASE я читал посты одного мужика (не помню имя), он ратовал за использование SAVEPOINTS для этого дела и приводил такие же примеры пролога и эпилога, но с использованием SAVEPOINT. При этом, на сколько я помню, добавлялась еще и возможность использовать RALLBACK до начала действий данной процедуры -- удобно в общем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 09:25 |
|
||
|
SP in transaction
|
|||
|---|---|---|---|
|
#18+
MasterZiv В отношении ROLLBACK-ов -- процедура никогда не должна реально ROLLBACK-чить, если не она начинала транзакцию, а должна лишь вернуть ненулевой код возврата. Самая первая процедура, которая начинала транзакцию, должна собрать окончательно коды возврата и сделать ROLLBACK если что-то не так. Вложенная процедура вполне может сделать в эпилоге rollback до savepoint-а, сделанного в прологе. У меня похожая конструкция с прологами, эпилогами и @@trancount работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 10:26 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=80&tid=2012714]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 326ms |

| 0 / 0 |
