powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / SP in transaction
10 сообщений из 10, страница 1 из 1
SP in transaction
    #33861978
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть некий обЪект, хранящийся в нескольких таблицах. Каждая таблица - это группы независимых между собой аттрибутов. Соответственно для каждой группы (таблицы) есть своя 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.
MainSP
begin
begin transaction
if (!subSP1)
  begin
     rollback transaction
     return
  end
...
if (!subSPN)
  begin
     rollback transaction
     return
  end
commit transaction
end

subSP1
begin
SelfTransaction=InTransaction // как это определить?
if (SelfTransaction)
  begin transaction
...
if (KARAUL)
begin
  ExitCode=KARAUL
  if (SelfTransaction)
    rollback transaction
end
...
if (SelfTransaction)
  commit transaction

return(ExitCode)
end
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
SP in transaction
    #33862012
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
SP in transaction
    #33862032
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во первых, управлять транзакциями изнутри хранимой процедуры это не комильфо. Оставь клиенткое клиенту.
А во вторых, всегда можно прочитать системную перменную @@trancount . Получишь текущий уровень вложеных транзакций (для обеих БД).

---
http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
SP in transaction
    #33862574
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНу во первых, управлять транзакциями изнутри хранимой процедуры это не комильфо. Оставь клиенткое клиенту.


Это ОЧЕНЬ спорный вопрос. Я бы его изложил ровно в противоположную сторону. Транзакции НИКОГДА не должны управляться с клиента. Нужна тебе транзакция - напиши процедуру. Нужна еще большая транзакция - напиши другую процедуру и вызови из нее данную и другие.
...
Рейтинг: 0 / 0
SP in transaction
    #33862577
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут может быть несколько подходов (но все базируются на анализе @@trancount, потому что другого способа проверить начата ли транзакция нет). Мы вводили практику использования стандартных пролога и эпилога процедур. Я могу запостить один из вариантов пролога и эпилога.
(найду только).

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

В отношении ROLLBACK-ов -- процедура никогда не должна реально ROLLBACK-чить, если не она начинала транзакцию, а должна лишь вернуть ненулевой код возврата. Самая первая процедура, которая начинала транзакцию, должна собрать окончательно коды возврата и сделать ROLLBACK если что-то не так.

При этом надо помнить о существовании режима CHAINED TRANSACTIONS, который я лично считаю просто чистым бредом, потому как не нужен он и неудобен, но он существует, и потенциально процедура может быть вызвана под CHAINED, но схема работы процедуры всегда расчитана либо на CHAINED , либо на UNCHAINED (как то, что я изложил выше). Запретить выполнение процедуры в ненужном ей режиме можно (и нужно) задав режим работы процедуры с помощью sp_procxmode .
...
Рейтинг: 0 / 0
SP in transaction
    #33862588
sn1251
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
+1
У меня точно так же.
...
Рейтинг: 0 / 0
SP in transaction
    #33862780
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот один из вариантов стандартного пролога и эпилога:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
--! BEGIN Body header. DO NOT MODIFY !!!
set nocount on
set jtc on
declare @rc int
select @rc =  0 

BEGIN TRANSACTION
--! END Body header. DO NOT MODIFY !!!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
--! BEGIN Body footer. DO NOT MODIFY !!!
OK:
COMMIT TRANSACTION
return  0 

FAILURE:
--raiserror 20000, 'Ошибка. Процедура такая-то. Данные не изменены.'
if @@trancount =  1 
  ROLLBACK TRANSACTION
else
  COMMIT TRANSACTION
if @rc =  0  
  select @rc =  1 
return @rc
--! END Body footer. DO NOT MODIFY !!!

При этом действуют сограшения, что НИКОГДА в теле процедуры не ставится return. Только переход на метку OK или на метку FAILURE.
и установка @rc в не ноль при ошибке.
...
Рейтинг: 0 / 0
SP in transaction
    #33862793
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, еще в sybase.com.public.ASE я читал посты одного мужика (не помню имя), он ратовал за использование SAVEPOINTS для этого дела и приводил такие же примеры пролога и эпилога, но с использованием SAVEPOINT. При этом, на сколько я помню, добавлялась еще и возможность использовать RALLBACK до начала действий данной процедуры -- удобно в общем.
...
Рейтинг: 0 / 0
SP in transaction
    #33862959
@@valera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv
В отношении ROLLBACK-ов -- процедура никогда не должна реально ROLLBACK-чить, если не она начинала транзакцию, а должна лишь вернуть ненулевой код возврата. Самая первая процедура, которая начинала транзакцию, должна собрать окончательно коды возврата и сделать ROLLBACK если что-то не так.


Вложенная процедура вполне может сделать в эпилоге rollback до savepoint-а, сделанного в прологе.
У меня похожая конструкция с прологами, эпилогами и @@trancount работает.
...
Рейтинг: 0 / 0
SP in transaction
    #33865562
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я же написал, что есть еще вариант с savepoints.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / SP in transaction
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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