powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции в процедурах
4 сообщений из 4, страница 1 из 1
Транзакции в процедурах
    #33316796
nik2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый,

ASE 12.5.1

Есть процедура, допустим, `A`

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
...
while @i <= @week
 begin
    if @NumProc =  1 
      exec OldDel @From = @St, @To = @Sp
    ...   
 end
...

тоесть явного указания начала транцакции в процедуре нет, в свою очередь в OldDel
примерно такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
   begin tran
        delete from traffic where moment between @From and @To
        ...
   commit
...

суть идее в том что хочется удалять данные мелкими кусками, хочется собственно знать отрабатывает ли это как одна большая транзакция ( процедура A ), или как несколько небольших ( OldDel ) ?
...
Рейтинг: 0 / 0
Транзакции в процедурах
    #33316881
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты должен понять, отработала ли транзакция(ии) в процедуре и вернуть соответствующий код возврата из процедуры. А снаружи его анализировать.
...
Рейтинг: 0 / 0
Транзакции в процедурах
    #33317032
nik2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полный кусок кода второй процедуры выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
create proc OldDel
  @From datetime
 ,@To   datetime
as
begin
    begin tran

        delete from traffic where moment between @From and @To
        if (@@error!= 0 ) or ((@@trancount >  0 ) and (@@transtate> 1 ))
        begin
            exec abort @ErrNo= 42999 ,@ResourceName='res_oldcleardataerror_traffic'
            rollback tran
            return  42991 
        end

  commit
--     rollback tran

end

я вот понять не могу - если допустим на 5 итерации, в процедуре `A`, OldDel вернет ошибку, ( в процедуре `A` код возврата OldDel не проверяется ), что будет с предыдущими четыремя за-commit'еными транзакциями ? Я вот подозреваю, что в данном конкретном случаее просто начнется 6 итерация ? И что вообще произойдет если процедура `A` сама завершится аварийно ?
...
Рейтинг: 0 / 0
Транзакции в процедурах
    #33318577
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nik2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
        if (@@error!= 0 ) or ((@@trancount >  0 ) and (@@transtate> 1 ))
        begin
            -- Я бы поменял местами эти два оператора. Наверняка процедура
            -- abort что-то делает, и наверное это откатывать не нужно.
            exec abort @ErrNo= 42999 ,@ResourceName='res_oldcleardataerror_traffic'
            rollback tran
            return  42991 
        end

я вот понять не могу - если допустим на 5 итерации, в процедуре `A`, OldDel вернет ошибку, ( в процедуре `A` код возврата OldDel не проверяется ), что
?

Плохо, что не проверяется.

nik2
будет с предыдущими четыремя за-commit'еными транзакциями ?


А что может быть с закоммиченными транзакциями ? Все , они закоммитились, значит они в базе и в логе.

nik2
Я вот подозреваю, что в данном конкретном случаее просто начнется 6 итерация ? И что вообще произойдет если процедура `A` сама завершится аварийно ?

Да, начнется, если ты это сам своим кодом явно не обойдешь. Ты же этим управляешь. Вот как напишешь -- так и будет.
А завершение аварийно процедуры и завершение транзакции никак не связано (почти не связано). Процедура может завершиться, а транзакция нет, и наоборот.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Транзакции в процедурах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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