powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вложенные транзакции в процедурах Transact-SQL в ASA8
5 сообщений из 5, страница 1 из 1
Вложенные транзакции в процедурах Transact-SQL в ASA8
    #33550256
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла такая задача. В процедуре на Watcom-SQL реализована работа с savepoint'ами:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
....
<начало цикла>
  savepoint t1;
  rc = CALL MyProc (...);
  if rc =  0  then
    release savepoint t1;
  else
    rollback to savepoint t1;
    insert into my_error_log (...) values (...);
  end if;
<конец цикла>
...
commit;

Как аналогичную штуку реализовать в процедуре на Transact-SQL в ASA 8?
Насколько я понял из документации, savepoints в этом случае не поддерживаются, вместо них предлагаются вложенные транзакции. Трабл в том, что оператор rollback в любом случае вызывает откат всех транзакций до первого уровня вложенности (в то время как commit завершает только транзакцию одного уровня вложенности).
Пробовал вариант:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
begin transaction t0   -- @@trancount=1
....
<начало цикла>
  begin transaction t1  -- @@trancount=2
  execute @rc = MyProc ...
  if @rc =  0  
    commit transaction t1  -- @@trancount=1
  else
    rollback transaction t1   -- в этот момент @@trancount сбрасывается в 0 !
    insert into my_error_log (...) values (...)
<конец цикла>
...
commit transaction t0  -- @@trancount=0

Несмотря на то, что согласно документации откат транзакций всех уровней вложенности вызывает rollback, вызванный без параметров , у меня то же самое происходит и при вызове rollback transaction t1.
...
Рейтинг: 0 / 0
Вложенные транзакции в процедурах Transact-SQL в ASA8
    #33550486
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На что установлена БД опция CHAINED ?
...
Рейтинг: 0 / 0
Вложенные транзакции в процедурах Transact-SQL в ASA8
    #33551098
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSНа что установлена БД опция CHAINED ?
CHAINED=ON
...
Рейтинг: 0 / 0
Вложенные транзакции в процедурах Transact-SQL в ASA8
    #33551266
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для поддержки вложенных транзакций должно быть OFF (то есть не стартовать транзакцию при любом DML, а только при явном BEGIN TRAN) - только тогда по идее @@TRANCOUNT начнет нормально показывать и станут работать вложенные транзакции в TSQL (естественно к WatcomSQL это не относится, там принципе работы всегда как CHAINED = ON).
...
Рейтинг: 0 / 0
Вложенные транзакции в процедурах Transact-SQL в ASA8
    #33551342
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для ASE используется
Код: plaintext
1.
2.
3.
4.
5.
if @@trancount >  0 
  save tran @tran_name
....
if @@error >  0 
  rollback tran @tran_name

Простейший тест
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create table tempdb.guest.test1
(
  i int
)
go

begin tran trn_1
insert into tempdb.guest.test1(i) values( 100 )
save tran trn_2
insert into tempdb.guest.test1(i) values( 101 )
rollback tran trn_2
commit tran trn_1
select * from tempdb.guest.test1

Должно выдать 100

Если да, то все работает так как надо. Надеюсь, что ASA обладает похожим поведением

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


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