Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / SP in transaction / 10 сообщений из 10, страница 1 из 1
18.07.2006, 18:25
    #33861978
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SP in transaction
Есть некий обЪект, хранящийся в нескольких таблицах. Каждая таблица - это группы независимых между собой аттрибутов. Соответственно для каждой группы (таблицы) есть своя 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
18.07.2006, 18:34
    #33862012
Ex_Soft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SP in transaction
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
18.07.2006, 18:40
    #33862032
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SP in transaction
Ну во первых, управлять транзакциями изнутри хранимой процедуры это не комильфо. Оставь клиенткое клиенту.
А во вторых, всегда можно прочитать системную перменную @@trancount . Получишь текущий уровень вложеных транзакций (для обеих БД).

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


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

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

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

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

Код: 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
19.07.2006, 09:25
    #33862793
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SP in transaction
Да, еще в sybase.com.public.ASE я читал посты одного мужика (не помню имя), он ратовал за использование SAVEPOINTS для этого дела и приводил такие же примеры пролога и эпилога, но с использованием SAVEPOINT. При этом, на сколько я помню, добавлялась еще и возможность использовать RALLBACK до начала действий данной процедуры -- удобно в общем.
...
Рейтинг: 0 / 0
19.07.2006, 10:26
    #33862959
@@valera
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SP in transaction
MasterZiv
В отношении ROLLBACK-ов -- процедура никогда не должна реально ROLLBACK-чить, если не она начинала транзакцию, а должна лишь вернуть ненулевой код возврата. Самая первая процедура, которая начинала транзакцию, должна собрать окончательно коды возврата и сделать ROLLBACK если что-то не так.


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


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