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

ASE 12.5.1


Есть ХП примерно такого вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
begin tran^
        ...
        delete dealer where ID=@ID^
        if (@@error!= 0 ) or TranslateFailed goto Error^
        exec SubscriberDel @ID=@ID, @deleteAlways=@deleteAlways^
        if (@@error!= 0 ) or TranslateFailed goto Error^
        ...
 commit^

В процедуре SubscriberDel также есть кусок кода
Код: plaintext
begin tran...commit

В таблице dealer есть foreign key на данные в таблице Subscriber ( которые удаляюся в процедуре SubscriberDel ), затык в общем в том что не смотря на то что приведенном куске кода перед вызовом SubscriberDel чистятся данные в dialer, SubscriberDel все равно говорит что не может удалить данные из таблицы Subscriber так как на них есть ссылка из таблицы dialer. как это можно разрулить ?
Если выполнять отдельной транзакцией
Код: plaintext
delete dialer where ID = ID
и отдельно
Код: plaintext
exec SubscriberDel
то все ок....
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33179736
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
g613 wrote:

> В процедуре SubscriberDel также есть кусок кода
>
> begin tran...commit

Автора подавить. Транзакциями управлять с клиента.
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33179746
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000
g613 wrote:

> В процедуре SubscriberDel также есть кусок кода
>
> begin tran...commit

Автора подавить. Транзакциями управлять с клиента.
Posted via ActualForum NNTP Server 1.2

тоесть проблеммы в консерватории и оно в принципе так работать не будет ?
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33179795
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
g613
В таблице dealer есть foreign key на данные в таблице Subscriber ( которые удаляюся в процедуре SubscriberDel ), затык в общем в том что не смотря на то что приведенном куске кода перед вызовом SubscriberDel чистятся данные в dialer, SubscriberDel все равно говорит что не может удалить данные из таблицы Subscriber так как на них есть ссылка из таблицы dialer.


Значит они не все такие записи удаляются. Тут надо вам разобраться в логике ваших процедур более детально.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33179803
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000

> В процедуре SubscriberDel также есть кусок кода
> begin tran...commit

Автора подавить. Транзакциями управлять с клиента.


Да ты что людям ерунду советуешь ? Транзакциями с клиента управлять конечно можно (иногда, если хочешь завалить работу БД), но только не в ASE и MSSQL . Oracle, Interbase - пожалуйста.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33179813
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
g613
begin tran...commit
тоесть проблеммы в консерватории и оно в принципе так работать не будет ?

Да не верь, все будет работать. Если конечно процедуры правильно написаны.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33179826
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv g613
В таблице dealer есть foreign key на данные в таблице Subscriber ( которые удаляюся в процедуре SubscriberDel ), затык в общем в том что не смотря на то что приведенном куске кода перед вызовом SubscriberDel чистятся данные в dialer, SubscriberDel все равно говорит что не может удалить данные из таблицы Subscriber так как на них есть ссылка из таблицы dialer.


Значит они не все такие записи удаляются. Тут надо вам разобраться в логике ваших процедур более детально.

чейто я совсем запутался...

спрошу просто, изменения выполненые в транзакции верхнего уровня должны быть видны во вложенной транзакции или нет ? Судя по всему вот в этом конкретном случае НЕТ, с чем это вообще может быть связано ?
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33180497
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну блин где-то так
declare @tranflag int
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
if @@trancount >  0  
begin
   set @tranflag =  1 
   save transaction MyTran
end
else
begin 
   set @tranflag =  0  
   begin tran MyTran
end 
.......
if @@error <>  0  or @@transtate >  1  
   goto error 

if @tranflag =  0  
   commit 
return 

error:
   rollback tran MyTran
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33181067
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело было не в бобине ( foreign key )

как я уже говорил есть процедура 'A'
Код: plaintext
1.
2.
3.
4.
5.
 begin tran
  ...
   exec B
  ...
  commit
 

и процедура B
Код: plaintext
1.
2.
3.
4.
5.
6.
 ...
 create table #TmpTable(....)
 begin tran
    ....
 commit
 return

в результате запуска A получаю

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
[ 121 ] billing.bill_2. 1 > exec A  800330 ;
Msg  277 , Level  16 , State  1 
Server 'B133', Procedure 'B', Line  485 
There was a transaction active when exiting the stored procedure 'B'. The temporary table '#TmpTable' was dropped in this transaction either explicitly or implicitly. This transaction has been aborted to prevent database corruption.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRAN is missing. Previous count =  1 , Current count =  0 .
Msg  42999 , Level  16 , State  1 
Server 'B133', Procedure 'EAbortInsTrig', Line  26 

на сколько я понял вся хрень происходит от того, что временная таблица #TmpTable создается впринципе в первой транзакции, в то время как удаляется во вложенной...

поправьте если не так.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33181804
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
g613
спрошу просто, изменения выполненые в транзакции верхнего уровня должны быть видны во вложенной транзакции или нет ?

Да. Они уже сделаны и "видны".

g613
Судя по всему вот в этом конкретном случае НЕТ, с чем это вообще может быть связано ?
Только разве что если транзакцию кто-то уже к этому моменту успел откатить.

Заметь, что если rollback делаешь, откатываются ВСЕ вложенные транзакции, до самой внешней.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33181806
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Процедуры наверное не умеешь писать правильно, чтобы они работали с транзакциями. Давай код.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33182210
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПроцедуры наверное не умеешь писать правильно, чтобы они работали с транзакциями. Давай код.

Да я как бы их и не пишу, мнеб чтоб оно работало. Народ который их пишет тестит походу на 11.9.2 а у нас 12.5.1...

Я у себя в общем сделал щас без `exec ....`, тоесть код из вложеной процедуры переписал в верхнюю процедуру...
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33182365
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
g613
Да я как бы их и не пишу, мнеб чтоб оно работало. Народ который их пишет тестит походу на 11.9.2 а у нас 12.5.1...

Это все равно.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33182415
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv g613
Да я как бы их и не пишу, мнеб чтоб оно работало. Народ который их пишет тестит походу на 11.9.2 а у нас 12.5.1...

Это все равно.

все равно в смысле 11.9.2 == 12.5.1 ?

вылезло просто уже несколько плюшек, с созданием таблиц:

if ( exists .... )
create table ...

с проверкой на наличие индекса, щас вот это...
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33182416
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в DealerDel два коммита на один begin tran ? На всякий случай ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create proc SubscriberDel
    @ID BIDENT,
    @DelVoIP tinyint =  0 ,
    @DelDialUp tinyint =  0 ,
    @DelTraffic tinyint =  0 ,
    @deleteAlways bbool =  0 

as

begin

   create table #TmpAccount (ID numeric( 12 , 0 ), AccType tinyint)
...

Вот так не пойдет. Если в процедуре создается временная таблица, эта процедура сама должна начинать транзакцию, т.е. такой begin tran, который переводит @@trancount из 0 в 1 должен быть именно в этой процедуре. Вызывать ее из других процедур можно будет только без открытой транзакции.
Или, говоря по-другому, создавать временные таблицы внутри транзакции можно только в той процедуре, которая реально транзакцию открывает (как правило, в самой внешней).

Да , еще , у меня закрадывается смутное подозрение, не в chained transactions ли эти процедуры написаны ? Тогда это совсем плохо.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33182461
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПочему в DealerDel два коммита на один begin tran ? На всякий случай ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create proc SubscriberDel
    @ID BIDENT,
    @DelVoIP tinyint =  0 ,
    @DelDialUp tinyint =  0 ,
    @DelTraffic tinyint =  0 ,
    @deleteAlways bbool =  0 

as

begin

   create table #TmpAccount (ID numeric( 12 , 0 ), AccType tinyint)
...

Вот так не пойдет. Если в процедуре создается временная таблица, эта процедура сама должна начинать транзакцию, т.е. такой begin tran, который переводит @@trancount из 0 в 1 должен быть именно в этой процедуре. Вызывать ее из других процедур можно будет только без открытой транзакции.
Или, говоря по-другому, создавать временные таблицы внутри транзакции можно только в той процедуре, которая реально транзакцию открывает (как правило, в самой внешней).


тоесть я таки не зря переписал это все...
Код: 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.
36.
37.
38.
39.
40.
create proc DealerDel

    @ID BIDENT,

    @deleteAlways bbool =  0 

as

 begin

 create table #TmpAccount (ID numeric( 12 , 0 ), AccType tinyint)

 begin tran

         delete DealerCardAccount from DealerCardAccount,DealerSale

                                Where DealerCardAccount.DealerSaleID=DealerSale.ID

                                  and DealerSale.DealerID=@ID

        if (@@error!= 0 ) or ((@@trancount >  0 ) and (@@transtate> 1 ))  goto Error

        Delete DealerSale where DealerID=@ID

        if (@@error!= 0 ) or ((@@trancount >  0 ) and (@@transtate> 1 ))  goto Error

        delete dealer where ID=@ID

        if (@@error!= 0 ) or ((@@trancount >  0 ) and (@@transtate> 1 ))  goto Error

        declare

           @DelVoIP tinyint,

           @DelDialUp tinyint,

           @DelTraffic tinyint

--------------------------------------- SubscriberDelWithoutTmp ---------------------------------
...


Да , еще , у меня закрадывается смутное подозрение, не в chained transactions ли эти процедуры написаны ? Тогда это совсем плохо.
unchained
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33183516
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чего ж тогда такой код у вас ?
Код: plaintext
1.
2.
3.
4.
5.
6.
	if @DealerName is not null
	begin
	  exec abort  42999 , 'res_errCanNotDelCard', @DealerName
	  rollback tran
	  return
	end

Транзакция не открывается, а rollback стоит.
...
Рейтинг: 0 / 0
Вложенные транзакции
    #33183692
g613
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА чего ж тогда такой код у вас ?
Код: plaintext
1.
2.
3.
4.
5.
6.
	if @DealerName is not null
	begin
	  exec abort  42999 , 'res_errCanNotDelCard', @DealerName
	  rollback tran
	  return
	end

Транзакция не открывается, а rollback стоит.

если чесно, я в тупике...

Central когда его попросить сгенерить DDL для процедуры пишет:
Код: plaintext
1.
sp_procxmode '...', unchained

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


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